Eureka介紹
1. Eureka是什麼
Eureka是一個基於REST的服務,主要用於AWS雲中的定位服務,以實現中間層伺服器的負載平衡和故障轉移
在 Spring Cloud 微服務 架構中通常用作 註冊中心
我們稱這個服務為 Eureka Server,還有一個與之互動的客戶端稱之為 Eureka Client
2. Eureka高階架構
如上圖所示,其中
Application Server 表示服務提供方
Application Client 表示服務消費方
Make Remote Call 表示遠端呼叫
服務在Eureka上註冊,然後每隔30秒傳送心跳來更新它們的租約。如果客戶端不能多次續訂租約,那麼它將在大約90秒內從伺服器登錄檔中剔除。註冊資訊和更新被複制到叢集中的所有eureka節點。來自任何區域的客戶端都可以查詢登錄檔資訊(每30秒發生一次)來定位它們的服務(可能在任何區域)並進行遠端呼叫。
(PS:Eureka Client需要每30秒給Eureka Server發一次心跳,同時更新Server上最新的註冊資訊到本地,如果Server多次沒有收到來自客戶端的心跳,那麼在90秒內會被Server上剔除)
3. Eureka 客戶端與伺服器之間的通訊
服務發現有兩種模式:一種是客戶端發現模式,一種是服務端發現模式。Eureka採用的是客戶端發現模式。
3.1. Register(註冊)
Eureka客戶端將關於執行例項的資訊註冊到Eureka伺服器。註冊發生在第一次心跳。
3.2. Renew(更新 / 續借)
Eureka客戶端需要更新最新註冊資訊(續借),通過每30秒傳送一次心跳。更新通知是為了告訴Eureka伺服器例項仍然存活。如果伺服器在90秒內沒有看到更新,它會將例項從登錄檔中刪除。建議不要更改更新間隔,因為伺服器使用該資訊來確定客戶機與伺服器之間的通訊是否存在廣泛傳播的問題。
3.3. Fetch Registry(抓取註冊資訊)
Eureka客戶端從伺服器獲取登錄檔資訊並在本地快取。之後,客戶端使用這些資訊來查詢其他服務。通過在上一個獲取週期和當前獲取週期之間獲取增量更新,這些資訊會定期更新(每30秒更新一次)。獲取的時候可能返回相同的例項。Eureka客戶端自動處理重複資訊。
3.4. Cancel(取消)
Eureka客戶端在關機時向Eureka伺服器傳送一個取消請求。這將從伺服器的例項登錄檔中刪除例項,從而有效地將例項從流量中取出。
4. Eureka自我保護模式
如果 Eureka 伺服器檢測到超過預期數量的註冊客戶端以一種不優雅的方式終止了連線,並且同時正在等待被驅逐,那麼它們將進入自我保護模式。這樣做是為了確保災難性網路事件不會擦除eureka登錄檔資料,並將其向下傳播到所有客戶端。
任何客戶端,如果連續3次心跳更新失敗,那麼它將被視為非正常終止,病句將被剔除。當超過當前註冊例項15%的客戶端都處於這種狀態,那麼自我保護將被開啟。
當自我保護開啟以後,eureka伺服器將停止剔除所有例項,直到:
- 它看到的心跳續借的數量回到了預期的閾值之上,或者
- 自我保護被禁用
預設情況下,自我保護是啟用的,並且,預設的閾值是要大於當前註冊數量的15%
5. Eureka VS Zookeeper
5.1. Eureka保證AP
Eureka伺服器節點之間是對等的,只要有一個節點在,就可以正常提供服務。
Eureka客戶端的所有操作可能需要一段時間才能在Eureka伺服器中反映出來,隨後在其他Eureka客戶端中反映出來。也就是說,客戶端獲取到的註冊資訊可能不是最新的,它並不保證強一致性
5.2. Zookeeper保證CP
Zookeeper叢集中有一個Leader,多個Follower。Leader負責寫,Follower負責讀,ZK客戶端連線到任何一個節點都是一樣的,寫操作完成以後要同步給所有Follower以後才會返回。如果Leader掛了,那麼重新選出新的Leader,在此期間服務不可用。
5.3. 為什麼用Eureka
分散式系統大都可以歸結為兩個問題:資料一致性和防止單點故障。而作為註冊中心的話,即使在一段時間內不一致,也不會有太大影響,所以在A和C之間選擇A是比較適合該場景的。
6. 其它相關
《 ofollow,noindex"> 分散式事務 》
7. 參考
Netflix/eureka/wiki/Understanding-eureka-client-server-communication" target="_blank" rel="nofollow,noindex">https://github.com/Netflix/eureka/wiki/Understanding-eureka-client-server-communication