Eureka 服務註冊與發現
版本採用 Zuul Core 1.4.6
微服務架構由一組小的服務組成,服務之間採用輕量級的通訊機制進行溝通,微服務之間調用關係是一個網狀結構,一個微服務在調用另一個微服務的時候,無法知道另一個微服務的具體地址;由於每個服務屬於"微"服務,每個服務生命週期不長,每個服務可能隨時被關閉、重啓、替換;在隨着訪問量增加的時候,微服務需要擴容,訪問量減少時,微服務需要縮容;這樣就導致每個微服務的地址在動態變化。這時候必然引入一個服務的註冊與發現問題。
在如今的的服務註冊與發現的框架中,SpringCloud提供了一套相對完整的技術組件,其中包括服務發現與註冊eureka
,Eureka 是 Netflix 出品的用於實現服務註冊和發現的工具。 Spring Cloud 集成了 Eureka,並提供了開箱即用的支持。Eureka 又可細分爲 Eureka Server 和 Eureka Client。
內容概覽
快速部署
Spring Cloud中,包括API網關以及服務註冊中心都是以服務的形式存在,所以,要部署Eureka
,就是構建一個服務,在服務中添加以下依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
在啓動類上加入@EnableEurekaServer
開啓服務註冊中心
添加配置文件
server.port = 8001
server.sessionTimeout=15
server.tomcat.max-threads = 800
server.tomcat.uri-encoding = UTF-8
#服務Eureka Server的身份驗證
#security.basic.enabled=true
#security.user.name=root
#security.user.password=angus
#是否將eureka自身作爲應用註冊到eureka註冊中心
eureka.client.registerWithEureka=false
#爲true時,可以啓動,但報異常:Cannot execute request on any known server
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
框架說明
服務註冊中心的高可用性,高可用的保證,就是備份,Eureka通過對自身的備份,當自身出現故障時,能保證整個系統的正常運行。註冊中心提供3個端口:
- Application Service port:爲服務提供者提供服務註冊,更新,下線,剔除,服務通訊等功能
- Application Client port:爲服務消費者提供服務發現和獲取服務提供者地址的功能
- Replicate port:爲處於不同節點的Eureka進行數據同步提供服務
Eureka基本使用
服務註冊
添加依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
在啓動類上加上註解 @EnableEurekaClient
聲明爲 EurekaClient
配置服務註冊中心地址:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8001/eureka/
server:
port: 8762
spring:
application:
name: service-hi
服務消費
添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
在啓動類上加上註解 @EnableDiscoveryClient
聲明爲 EurekaConsume
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8001/eureka/
server:
port: 8764
spring:
application:
name: service-consume
之後就可以調用服務提供者的服務完成服務消費
負載均衡
在服務消費者的pom中添加依賴
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
在啓動類中向程序的ioc注入一個bean: restTemplate,並通過@LoadBalanced註解表明這個restRemplate開啓負載均衡的功能
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
此時架構如圖:
服務註冊中心的自我保護
在默認配置中,Eureka Server在默認90s沒有得到客戶端的心跳,則註銷該實例,但是往往因爲微服務跨進程調用,網絡通信往往會面臨着各種問題,比如微服務狀態正常,但是因爲網絡分區故障時,Eureka Server註銷服務實例則會讓大部分微服務不可用,爲了解決這個問題,Eureka 有自我保護機制,通過在Eureka Server配置如下參數,可啓動保護機制:
eureka.server.enable-self-preservation=true
它的原理是,當Eureka Server節點在短時間內丟失過多的客戶端時(可能發送了網絡故障),那麼這個節點將進入自我保護模式,不再註銷任何微服務,當網絡故障回覆後,該節點會自動退出自我保護模式。
服務註冊中心的高可用性實現
簡單來說, Eureka的高可用,實際上就是將自己也作爲服務向其他服務註冊中心進行註冊,這樣就可以形成一組相互註冊的服務註冊中心,以實現服務清單的互相同步,達到高可用的效果。在CAP原則中,相對於zookeeper
滿足AP
(可用性和分區容錯性)來說,Eureka是滿足CP
( 一致性和分區容錯性)的。這是它與zookeeper
的最大區別。
每個註冊中心都將自己作爲EurekaClient
註冊到其他註冊中心中去
例如:以下兩個註冊中心
- Peer1
spring.application.name=eureka-service-1
# 端口
server.port=1000
# 實例的主機名稱
eureka.instance.hostname=Peer1
# 不要向註冊中心註冊自己
#eureka.client.register-with-eureka=false
#表示不去檢索其他的服務,因爲服務註冊中心本身的職責就是維護服務實例,它也不需要去檢索其他服務
#eureka.client.fetch-registry=false
# 指定服務註冊中心地址
eureka.client.service-url.defaultZone=http://Peer2:1001/eureka
- Peer2
spring.application.name=eureka-service-2
# 端口
server.port=1001
# 實例的主機名稱
eureka.instance.hostname=Peer2
# 不要向註冊中心註冊自己
#eureka.client.register-with-eureka=false
#表示不去檢索其他的服務,因爲服務註冊中心本身的職責就是維護服務實例,它也不需要去檢索其他服務
#eureka.client.fetch-registry=false
# 指定服務註冊中心地址
eureka.client.service-url.defaultZone=http://Peer1:1000/eureka
而對於服務提供者,可作如下修改:
eureka.client.service-url.defaultZone=http://Peer1:1000/eureka,http://Peer2:1001/eureka
當然,也可只註冊到某個節點上,其他的節點會通過Replicate
進行同步,一般建議以集羣方式進行配置,即多註冊中心配置。避免單點故障,Eureka在搜索註冊中心時,根據defaultZone列表,找到一個可用的,之後就不會繼續去下一個註冊中心地址拉取服務列表了,此時若其中一個註冊中心發生故障,這個時候客戶端會繼續去第二個註冊中心拉取服務列表的。
生產環境
TODO
常見問題
TODO
更新計劃
- 增加自定義負載均衡策略實現
- Eureka的自我保護策略改進實現