spring cloud心跳檢測自我保護(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.)


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

Eureka server和client之間每隔30秒會進行一次心跳通信,告訴server,client還活着

在某一些時候注冊在Eureka的服務已經掛掉了,但是服務卻還留在Eureka的服務列表的情況。

 

自我保護機制

默認情況下,如果Eureka Server在一定時間內(默認90秒)沒有接收到某個微服務實例的心跳,Eureka Server將會移除該實例。但是當網絡分區故障發生時,微服務與Eureka Server之間無法正常通信,而微服務本身是正常運行的,此時不應該移除這個微服務,所以引入了自我保護機制。

自我保護模式正是一種針對網絡異常波動的安全保護措施,使用自我保護模式能使Eureka集群更加的健壯、穩定的運行。

自我保護機制的工作機制是如果在15分鍾內超過85%的客戶端節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網絡故障,Eureka Server自動進入自我保護機制,

自我保護機制時會出現以下幾種情況:

1、Eureka Server不再從注冊列表中移除因為長時間沒收到心跳而應該過期的服務。

2、Eureka Server仍然能夠接受新服務的注冊和查詢請求,但是不會被同步到其它節點上,保證當前節點依然可用。

3、當網絡穩定時,當前Eureka Server新的注冊信息會被同步到其它節點中

 

Eurake有一個配置參數eureka.server.renewalPercentThreshold,定義了renews 和renews threshold的比值,默認值為0.85。當server在15分鍾內,比值低於percent,即少了15%的微服務心跳,server會進入自我保護狀態,Self-Preservation。在此狀態下,server不會刪除注冊信息,這就有可能導致在調用微服務時,實際上服務並不存在。 

這種保護狀態實際上是考慮了client和server之間的心跳是因為網絡問題,而非服務本身問題,不能簡單的刪除注冊信息

 

解決建議是:

1、在生產上可以開自注冊,部署兩個server 
2、在本機器上測試的時候,可以把比值調低,比如0.49 
3、簡單粗暴把自我保護模式關閉

eureka.server.enableSelfPreservation=false

 

歡迎大家關注公眾號,不定時干貨,只做有價值的輸出

作者:Dawnzhang 
出處:https://www.cnblogs.com/clwydjgs/ 
版權:本文版權歸作者
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任


免責聲明!

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



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