Eureka工作原理及心跳機制


Eureka原理

1.基本原理
上圖是來自eureka的官方架構圖,這是基於集群配置的eureka;
處於不同節點的eureka通過Replicate進行數據同步
Application Service為服務提供者
Application Client為服務消費者
Make Remote Call完成一次服務調用
服務啟動后向Eureka注冊,Eureka Server會將注冊信息向其他Eureka Server進行同步,當服務消費者要調用服務提供者,則向服務注冊中心獲取服務提供者地址,然后會將服務提供者地址緩存在本地,下次再調用時,則直接從本地緩存中取,完成一次調用。

當服務注冊中心Eureka Server檢測到服務提供者因為宕機、網絡原因不可用時,則在服務注冊中心將服務置為DOWN狀態,並把當前服務提供者狀態向訂閱者發布,訂閱過的服務消費者更新本地緩存。

服務提供者在啟動后,周期性(默認30秒)向Eureka Server發送心跳,以證明當前服務是可用狀態。Eureka Server在一定的時間(默認90秒)未收到客戶端的心跳,則認為服務宕機,注銷該實例。

2.Eureka的自我保護機制
在默認配置中,Eureka Server在默認90s沒有得到客戶端的心跳,則注銷該實例,但是往往因為微服務跨進程調用,網絡通信往往會面臨着各種問題,比如微服務狀態正常,但是因為網絡分區故障時,Eureka Server注銷服務實例則會讓大部分微服務不可用,這很危險,因為服務明明沒有問題。

為了解決這個問題,Eureka 有自我保護機制,通過在Eureka Server配置如下參數,可啟動保護機制

eureka.server.enable-self-preservation=true
它的原理是,當Eureka Server節點在短時間內丟失過多的客戶端時(可能發送了網絡故障),那么這個節點將進入自我保護模式,不再注銷任何微服務,當網絡故障回復后,該節點會自動退出自我保護模式。

自我保護模式的架構哲學是寧可放過一個,決不可錯殺一千

3. 作為服務注冊中心,Eureka比Zookeeper好在哪里
著名的CAP理論指出,一個分布式系統不可能同時滿足C(一致性)、A(可用性)和P(分區容錯性)。由於分區容錯性在是分布式系統中必須要保證的,因此我們只能在A和C之間進行權衡。在此Zookeeper保證的是CP, 而Eureka則是AP。

3.1 Zookeeper保證CP
當向注冊中心查詢服務列表時,我們可以容忍注冊中心返回的是幾分鍾以前的注冊信息,但不能接受服務直接down掉不可用。也就是說,服務注冊功能對可用性的要求要高於一致性。但是zk會出現這樣一種情況,當master節點因為網絡故障與其他節點失去聯系時,剩余節點會重新進行leader選舉。問題在於,選舉leader的時間太長,30 ~ 120s, 且選舉期間整個zk集群都是不可用的,這就導致在選舉期間注冊服務癱瘓。在雲部署的環境下,因網絡問題使得zk集群失去master節點是較大概率會發生的事,雖然服務能夠最終恢復,但是漫長的選舉時間導致的注冊長期不可用是不能容忍的。

3.2 Eureka保證AP
Eureka看明白了這一點,因此在設計時就優先保證可用性。Eureka各個節點都是平等的,幾個節點掛掉不會影響正常節點的工作,剩余的節點依然可以提供注冊和查詢服務。而Eureka的客戶端在向某個Eureka注冊或時如果發現連接失敗,則會自動切換至其它節點,只要有一台Eureka還在,就能保證注冊服務可用(保證可用性),只不過查到的信息可能不是最新的(不保證強一致性)。除此之外,Eureka還有一種自我保護機制,如果在15分鍾內超過85%的節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網絡故障,此時會出現以下幾種情況:

Eureka不再從注冊列表中移除因為長時間沒收到心跳而應該過期的服務
Eureka仍然能夠接受新服務的注冊和查詢請求,但是不會被同步到其它節點上(即保證當前節點依然可用)
當網絡穩定時,當前實例新的注冊信息會被同步到其它節點中

Eureka心跳機制
1.服務器啟動成功,等待客戶(服務)端注冊,在啟動過程中如果我們配置了集群,集群之間會同步注冊表,每一個Eureka serve都會存在這個集群完整的服務注冊表信息
2.Eureka client 啟動時根據配置信息,去注冊到指定的注冊中心
3.Eureka client會每30秒向Eureka server 發送一次心跳請求,證明該客戶端服務正常
4.當Eureka server90s內沒有接受客戶端服務正常,注冊中心會認為該節點失效,會注銷該實列 (從注冊表中刪除注冊信息)
5.單位時間內如果服務端統計到大量客戶端沒有發送心跳,則認為網絡異常,進去自我保護機制,不在剔除沒有發送心跳的客戶端
6.當客戶端恢復正常之后,服務端就會退出自我保護模式
7.客戶端定時全量或增量從注冊中心獲取服務注冊表,並且會緩存到本地
8.服務調用時,客戶端會先從本地緩存找到調用服務,如果調取不到 先從注冊中心刷新注冊表,在同步到本地
9.客戶端獲取不到目標服務器信息發起服務調用
10.客戶端程序關閉時向服務端發送取消請求,服務器將實例從注冊表中刪除


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM