Spring Cloud 服務註冊與發現、高可用(Eureka)java
在微服務架構中,服務發現組件是很關鍵的一個組件,服務發現組件就是去管理各服務的網絡地址等信息web
服務提供者、服務消費者、服務發現組件的關係spring
Spring Cloud 支持多種服務發現組件,如 Eureka、Consul 和 Zookeeper 等,這裏主要介紹 Spring Cloud Eureka 的使用緩存
Eureka 是 Netflix 開源的服務治理模塊,自己是一個基於 Rest 的服務。Spring Cloud 中將 Eureka 集成在 Spring Cloud Netflix 項目中,另外 Spring Cloud Netflix 還提供了自配置的Netflix OSS整合。提供的模塊包括:服務發現(Eureka),斷路器(Hystrix),智能路由(Zuul),客戶端負載均衡(Ribbon)等服務器
Eureka 架構圖網絡
Eureka 是包含兩個組件的: Eureka Server
和 Eureka Client
架構
建立一個 Spring Boot 項目,依賴項 dependencies 添加 Eureka Server
, pom.xml 文件部份內容以下:app
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.cindy</groupId> <artifactId>eureka-server</artifactId> <version>0.0.1-SNAPSHOT</version> <name>eureka-server</name> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
要啓動一個服務註冊中心,咱們要使用註解 @EnableEurekaServer
負載均衡
@SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
這個時候若是咱們直接啓動,會發現有個鏈接異常,那是由於默認設置下,服務註冊中心也會把本身當作客戶端來註冊本身,也就是說 eureka server 同時也是一個 eureka client,須要指定一個 server。而一般咱們只須要它做爲註冊中心,可使用 eureka.client.registerWithEureka=false
和 eureka.client.fetchRegistry:false
來禁用客戶端註冊行爲spring-boot
spring: application: name: eureka-server server: port: 8761 eureka: client: # 是否將本身註冊到 Eureka Server registerWithEureka: false # 是否從 Eureka Server 獲取註冊信息 fetchRegistry: false
eureka server 有一個UI的主頁,而且
/eureka/*
下有正常 Eureka 功能的HTTP API端點。
啓動工程,訪問 http://localhost:8761能夠看到如下頁面,因爲尚未註冊服務,因此沒有被發現的服務
上面建立了服務註冊中心
接下來咱們來建立服務客戶端,也就是咱們要去註冊的服務
仍是去建立一個 Spring Boot 工程,要添加的依賴爲 Eureka Discovery
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.cindy</groupId> <artifactId>product</artifactId> <version>1.0.0-SNAPSHOT</version> <name>product</name> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
一樣的,要使用服務註冊須要主類上添加註解,註解爲 @EnableDiscoveryClient
@SpringBootApplication @EnableDiscoveryClient public class ProductApplication { public static void main(String[] args) { SpringApplication.run(ProductApplication.class, args); } }
上面的註解也可以使用
@EnableEurekaClient
,而@EnableDiscoveryClient
是spring-cloud-commons
項目的註解,是一個高度的抽象,對各類服務發現組件都提供了支持,如 Zookeeper 和 Consul 也支持
這時須要在客戶端這邊配置服務註冊中心的一些信息,defaultZone
是與 Eureka Server 交互地址,用於查詢服務和註冊服務 (默認端口是 8761),若是要向多個服務中心註冊用逗號隔開
spring: application: name: product server: port: 8081 eureka: client: serviceUrl: # 這裏默認是 http://localhost:8761/eureka/ defaultZone: http://localhost:8761/eureka/
若是想要 IP 地址註冊,而不是主機名。能夠設置
eureka.instance.preferIpAddress=true
先啓動 Eureka Server,再啓動該工程,咱們打開 Eureka Server 的 UI 界面,能夠看到咱們的 product 服務已經註冊成功了
儘管 Eureka 的客戶端具備緩存機制,即便 Eureka Server 宕機,服務之間也能夠經過緩存調用,可是在 Eureka Server 宕機的時候,一些微服務也可能出現不可用的問題,而這些狀況沒有被更新到緩存中,就可能會影響到某些微服務的調用
生產中一般會部署一個高可用的 Eureka Server 集羣,由上面的 Eureka 架構圖也能夠看出能夠經過運行多個 Eureka Server 實例並讓他們相互註冊來實現高可用部署。
咱們來改一下上面的 eureka-server ,同時啓動兩個實例,來構建雙節點的服務註冊中心
這裏咱們要讓 Eureka Server 相互註冊,因此 registerWithEureka
和 fetchRegistry
就不設置未 false 了,而 serviceUrl.defaultZone
則須要填入其餘 Eureka Server 的服務地址
spring: application: name: eureka-server --- server: port: 8761 eureka: client: serviceUrl: defaultZone: http://127.0.0.1:8762/eureka/ --- server: port: 8762 eureka: client: serviceUrl: defaultZone: http://127.0.0.1:8761/eureka/
這裏咱們起兩臺服務器,端口號分別爲 8761 和 8762
啓動以後咱們再啓動註冊服務
端口號爲 8762 的 server也能獲取端口號爲 8761 server 的服務註冊信息,儘管咱們的註冊服務只寫了 http://127.0.0.1:8761/eureka/
, 這裏咱們要註冊的服務最好把全部的 Eureka Server 地址都添加上,避免在某些狀況下服務重啓會註冊不到
若是要構建多個節點的集羣,其實也是很簡單的,只要它們至少一個邊緣彼此鏈接,也就是兩兩相互註冊就能夠了,同時服務同時向他們進行註冊