SpringCloud警告(Eureka):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可能存在維護了錯誤的實例列表(當它們沒有啟動的時候,Eureka卻把它當成啟動的了);Renews值小於Threshold值,因此剩下未過期的都是安全的。

原因分析:

這個是Eureka的自我保護機制。Eureka Server在運行期間,會統計心跳失敗的比例在15分鍾之內是否低於85%,如果出現低於的情況(在單機調試的時候很容易滿足,實際在生產環境上通常是由於網絡不穩定導致),Eureka Server會將當前的實例注冊信息保護起來,同時提示這個警告。

Eureka server和client之間每隔30秒會進行一次心跳通信,告訴server,client還活着。由此引出兩個名詞: 
Renews threshold:server期望在每分鍾中收到的心跳次數 
Renews (last min):上一分鍾內收到的心跳次數。

前文說到禁止注冊server自己為client,不管server是否禁止,閾值(threshold)是1。client個數為n,閾值為1+2*n(此為一個server且禁止自注冊的情況) 
如果是多個server,且開啟了自注冊,那么就和client一樣,是對於其他的server來說就是client,是要*2的

我開了兩個server,自注冊,相關數據如下 
這里寫圖片描述 
閾值:1+2*1 
renews: 
1)自注冊 2 + 2*1 
2)非自注冊:2*1

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

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

eureka.server.enableSelfPreservation=false

 參考文檔

https://www.cnblogs.com/breath-taking/articles/7940364.html


免責聲明!

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



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