SpringCloud服務的註冊與發現(Eureka)

6會飛的魚6發表於2018-07-25

Spring Cloud是一個基於Spring Boot實現的雲應用開發工具,它為基於JVM的雲應用開發中涉及的配置管理、服務發現、斷路器、智慧路由、微代理、控制匯流排、全域性鎖、決策競選、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。

Spring Cloud簡介
Spring Cloud包含了多個子專案(針對分散式系統中涉及的多個不同開源產品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等專案。

微服務架構
微服務(Microservices Architecture)是一種架構風格,一個大型複雜軟體應用由一個或多個微服務組成。系統中的各個微服務可被獨立部署,各個微服務之間是鬆耦合的。每個微服務僅關注於完成一件任務並很好地完成該任務。在所有情況下,每個任務代表著一個小的業務能力。

微服務的概念源於2014年3月Martin Fowler所寫的章“Microservices”http://martinfowler.com/articles/microservices.html
微服務架構(Microservices Architecture)
微服務架構的核心思想是,一個應用是由多個小的、相互獨立的、微服務組成,這些服務執行在自己的程式中,開發和釋出都沒有依賴。不同服務通過一些輕量級互動機制來通訊,例如 RPC、HTTP 等,服務可獨立擴充套件伸縮,每個服務定義了明確的邊界,不同的服務甚至可以採用不同的程式語言來實現,由獨立的團隊來維護。簡單的來說,一個系統的不同模組轉變成不同的服務!而且服務可以使用不同的技術加以實現!

微服務設計
那我們在微服務中應該怎樣設計呢。以下是微服務的設計指南:
職責單一原則(Single Responsibility Principle):把某一個微服務的功能聚焦在特定業務或者有限的範圍內會有助於敏捷開發和服務的釋出。

設計階段就需要把業務範圍進行界定。
需要關心微服務的業務範圍,而不是服務的數量和規模儘量小。數量和規模需要依照業務功能而定。

於SOA不同,某個微服務的功能、操作和訊息協議儘量簡單。
專案初期把服務的範圍制定相對寬泛,隨著深入,進一步重構服務,細分微服務是個很好的做法。

關於微服務架構的取捨
在合適的專案,合適的團隊,採用微服務架構收益會大於成本。
微服務架構有很多吸引人的地方,但在擁抱微服務之前,也需要認清它所帶來的挑戰。

需要避免為了“微服務”而“微服務”。
微服務架構引入策略 – 對傳統企業而言,開始時可以考慮引入部分合適的微服務架構原則對已有系統進行改造或新建微服務應用,逐步探索及積累微服務架構經驗,而非全盤實施微服務架構。

更多關於微服務架構內容-請參考我的另一篇文章:《什什麼是微服務架構?》

服務治理
由於Spring Cloud為服務治理做了一層抽象介面,所以在Spring Cloud應用中可以支援多種不同的服務治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服務治理抽象層的作用下,我們可以無縫地切換服務治理實現,並且不影響任何其他的服務註冊、服務發現、服務呼叫等邏輯。

Spring Cloud Eureka
Spring Cloud Eureka來實現服務治理。
Spring Cloud Eureka是Spring Cloud Netflix專案下的服務治理模組。而Spring Cloud Netflix專案是Spring Cloud的子專案之一,主要內容是對Netflix公司一系列開源產品的包裝,它為Spring Boot應用提供了自配置的Netflix OSS整合。通過一些簡單的註解,開發者就可以快速的在應用中配置一下常用模組並構建龐大的分散式系統。它主要提供的模組包括:服務發現(Eureka),斷路器(Hystrix),智慧路由(Zuul),客戶端負載均衡(Ribbon)等。

Eureka Server
提供服務註冊和發現
新增依賴
在專案 spring-cloud-eureka-service pom.xml中引入需要的依賴內容:

org.springframework.cloud    spring-cloud-starter-eureka-server

開啟服務註冊
通過 @EnableEurekaServer 註解啟動一個服務註冊中心提供給其他應用進行對話,這個註解需要在springboot工程的啟動application類上加

package io.ymq.example.eureka.server;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {

public static void main(String[] args) {
    SpringApplication.run(EurekaServerApplication.class, args);
}

}
新增配置
在預設設定下,該服務註冊中心也會將自己作為客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行為,只需要在 application.yml配置檔案中增加如下資訊:

registerWithEureka: false
fetchRegistry: false
完整配置

server:
port: 8761

eureka:
instance:

hostname: localhost

client:

registerWithEureka: false
fetchRegistry: false
serviceUrl:
  defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

訪問服務
啟動工程後,訪問:http://localhost:8761/
可以看到下面的頁面,其中還沒有發現任何服務。

Service Provider
服務提供方
將自身服務註冊到 Eureka 註冊中心,從而使服務消費方能夠找到
新增依賴
在專案 spring-cloud-eureka-provider pom.xml中引入需要的依賴內容:

org.springframework.cloud
spring-cloud-starter-eureka-server

開啟服務註冊
在應用主類中通過加上 @EnableEurekaClient,但只有Eureka 可用,你也可以使用@EnableDiscoveryClient。需要配置才能找到Eureka註冊中心伺服器

package io.ymq.example.eureka.provider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@EnableEurekaClient
@RestController
public class EurekaProviderApplication {

@RequestMapping("/")
public String home() {
    return "Hello world";
}

public static void main(String[] args) {
    SpringApplication.run(EurekaProviderApplication.class, args);
}

}
新增配置
需要配置才能找到Eureka伺服器。例:
完整配置

eureka:
client:

serviceUrl:
  defaultZone: http://localhost:8761/eureka/

spring:
application:

name: eureka-provider

server:
port: 8081
其中 defaultZone是一個魔術字串後備值,為任何不表示首選項的客戶端提供服務URL(即它是有用的預設值)。 通過 spring.application.name屬性,我們可以指定微服務的名稱後續在呼叫的時候只需要使用該名稱就可以進行服務的訪問
訪問服務
啟動該工程後,再次訪問啟動工程後:http://localhost:8761/
可以如下圖內容,我們定義的服務被成功註冊了。

原始碼下載
GitHub:https://github.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka
碼雲:https://gitee.com/souyunku/spring-cloud-examples/tree/master/spring-cloud-eureka

文章來源:http://www.roncoo.com/article/detail/131693
更多參考內容:http://www.roncoo.com/article/index?tn=SpringCloud


相關文章