天天看點

〖Spring Cloud〗EureKa的自我保護機制詳解

EureKa自我保護機制

相關視訊教程(來自動力節點):https://www.bilibili.com/video/BV1nK4y1j7gL

一句話總結就是:某時刻某一個微服務不可用,eureka不會立即清理,依舊會對該微服務的資訊進行儲存!

為什麼會有自我保護機制?

預設情況下,當eureka server在一定時間内沒有收到執行個體的心跳,便會把該執行個體從系統資料庫中删除(預設是90秒),但是,如果短時間内丢失大量的執行個體心跳,便會觸發eureka server的自我保護機制,比如在開發測試時,需要頻繁地重新開機微服務執行個體,但是我們很少會把eureka server一起重新開機(因為在開發過程中不會修改eureka注冊中心),當一分鐘内收到的心跳數大量減少時,會觸發該保護機制。

可以在eureka管理界面看到Renews threshold和Renews(last min),當後者(最後一分鐘收到的心跳數)小于前者(心跳門檻值)的時候,觸發保護機制,會出現紅色的警告:

EMERGENCY!EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT.RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEGING EXPIRED JUST TO BE SAFE.

從警告中可以看到,eureka認為雖然收不到執行個體的心跳,但它認為執行個體還是健康的,eureka會保護這些執行個體,不會把它們從系統資料庫中删掉。

該保護機制的目的是避免網絡連接配接故障,在發生網絡故障時,微服務和注冊中心之間無法正常通信,但服務本身是健康的,不應該登出該服務,如果eureka因網絡故障而把微服務誤删了,那即使網絡恢複了,該微服務也不會重新注冊到eureka server了,因為隻有在微服務啟動的時候才會發起注冊請求,後面隻會發送心跳和服務清單請求,這樣的話,該執行個體雖然是運作着,但永遠不會被其它服務所感覺。

是以,eureka server在短時間内丢失過多的用戶端心跳時,會進入自我保護模式,該模式下,eureka會保護系統資料庫中的資訊,不在登出任何微服務,當網絡故障恢複後,eureka會自動退出保護模式。自我保護模式可以讓叢集更加健壯。

但是我們在開發測試階段,需要頻繁地重新開機釋出,如果觸發了保護機制,則舊的服務執行個體沒有被删除,這時請求有可能跑到舊的執行個體中,而該執行個體已經關閉了,這就導緻請求錯誤,影響開發測試。

是以,在開發測試階段,我們可以把自我保護模式關閉,隻需在eureka server配置檔案中加上如下配置即可:eureka.server.enable-self-preservation=false 【不推薦關閉自我保護機制】