微服務:Eureka基礎
學習自:Eureka 入門教程 - 基礎篇 | Clay 的技術空間
16 圖 | 實戰 Eureka 集群搭建+服務注冊+調用 - 知乎
k8s發布Spring cloud+eureka架構服務優雅啟動停止方案 - 楓&vce - 博客園
1、簡介
CAP定理
在了解Eureka之前,需要先了解一下CAP定理,詳細介紹看Linux:CAP定理——分布式計算 - ShineLe - 博客園。
簡單介紹一下CAP:
CAP 定理指的是在一個分布式系統中,Consistency(一致性)、 Availability(可用性)、 Partition tolerance(分區容錯性),三者不可兼得。
- 一致性(C):分布式系統中多個主機之間是否能夠保持數據一致的特性。即,當系統數據發生更新操作后,各個主機中的數據仍然處于一致的狀態。
- 可用性(A):系統提供的服務必須一直處于可用的狀態,即對于用戶的每一個請求,系 統總是可以在有限的時間內對用戶做出響應。
- 分區容錯性(P):分布式系統在遇到任何網絡分區故障時,仍能夠保證對外提供滿足一
致性和可用性的服務。
分布式系統一般都要保證P,即在某個集群失效時,仍能對外提供服務,因此必須在C和A上做出取舍。
Eureka
Eureka是Netflix開發的一款基于HTTP REST的服務,由Pivotal公司將其整合進Spring Cloud生態。Netflix在設計Eureka時遵照AP原則,用于服務注冊發現、負載均衡、故障轉移等,也是Spring Cloud中使用的服務注冊發現組件。
Eureka采用C/S架構,提供了一個基于Java的Client組件,用來與S端交互,同時內置一套負載均衡器,可以進行基本的輪詢負載均衡。
Eureka相關文檔:Eureka 項目、Eureka 官方英文文檔、Spring Cloud Eureka 官方中文文檔。
2、Eureka服務治理體系

Eureka服務的三個角色
- 服務注冊中心:由Eureka實現,提供服務注冊、發現的功能,稱為Eureka-Server;
- 服務消費者:消費者從注冊中心獲取服務列表,從而得知該去何處調用所需的服務;
- 服務提供者:提供服務的應用,可以是Spring Boot應用,也可以是其他技術平臺并且遵循Eureka通信機制的應用。它將自己提供的服務注冊到Eureka,以供其他應用發現。
3、Eureka高可用性
1)Eureka高可用性
Eureka的服務注冊中心,與其他服務注冊中心一樣,支持高可用配置。依托強一致性提供良好的服務實例可用性,可以應對多種不同的故障場景。
Eureka服務端支持集群模式部署,當集群中有分片故障時(>85%的服務實例丟失心跳),Eureka會自動轉入自我保護模式。它允許在分片故障時繼續提供服務發現和注冊,當故障恢復時,集群中的其它分片會把各自狀態再次同步回來。
集群中的不同服務注冊中心通過異步模式互相復制各自的狀態,這也意味著在給定的時間點每個實例關于所有服務的狀態可能存在不一致的現象。
2)Eureka自我保護機制
默認情況下,如果Eureka Server在一定時間內沒收到某個微服務實例的心跳,Eureka Server將會注銷該實例。
但是當網絡分區故障發生時,微服務和Eureka Server之間無法正常通信,這就可能變得非常危險了。因為微服務本身是健康的,此時就不該注銷它。Eureka Server通過“自我保護機制”來解決這個問題,當Eureka Server短時間內丟失過多客戶端時(超過85%服務實例丟失心跳,意味著可能發生了網絡分區故障),那么這個節點就會進入自我保護模式。
一旦進入該模式,Eureka Server就會保護服務注冊表中的信息,不再刪除服務注冊表中的數據(即不會注銷任何微服務)。當網絡故障恢復后,該Eureka會自動退出自我保護模式。自我保護模式是一種對網絡異常的安全保護措施,使用自我保護模式,可以讓Eureka集群更加健壯穩定。
在自我保護模式中,Eureka Server會保護注冊表中的信息,不再注銷任何服務實例。當它收到的心跳重新恢復至閾值以上時,該Eureka Server節點就會自動退出自我保護模式。它的設計哲學就是寧可保留錯誤的服務注冊信息,也不盲目注銷任何可能健康的服務實例。
在Spring Cloud中,可以用eureka.server.enable-self-preservation: false來禁用自我保護模式。
3)Eureka 自我保護模式的效果
- Eureka不能從注冊列表移除因長期沒收到心跳而應該過期的服務;
- Eureka仍能接受新服務的注冊和查詢請求,但是不會被同步到其他節點(高可用);
- Eureka在網絡穩定時,當前實例新的注冊信息會被同步到其他節點中(最終一致性);
- Eureka可以很好應對由于網絡故障導致部分節點失去聯系的情況,不會像ZooKeeper一樣是的注冊中心癱瘓。
4)Eureka 健康檢查
在Eureka中,微服務的狀態值可以為UP、DOWN、OUT_OF_SERVICE、UNKNOWN等,只有UP的微服務會被請求。
由于Eureka Server和Eureka Client之間用心跳機制來確定Eureka Client的狀態,默認情況下S、C之間心跳保持正常,應用程序就會始終保持UP狀態,所以微服務的UP并不能完全反應應用程序的狀態。
SpringBoot Actuator提供了/health端點,用于顯示應用程序健康信息,主需要將該端點中的健康狀態傳播到Eureka Server就可以了。為了實現這一點,需要在SpringBoot中進行如下配置:
# 開啟健康檢查(需要添加spring-boot-starter-actuator依賴) eureka.client.healthcheck.enabled = true

浙公網安備 33010602011771號