「 從0到1學習微服務SpringCloud 」03 Eureka的自我保護機制

系列文章(更新ing):

「 從0到1學習微服務SpringCloud 」01 一起來學呀!

「 從0到1學習微服務SpringCloud 」02 Eureka服務註冊與發現

Eureka的高可用需要依賴於它的心跳機制和自我保護機制

心跳檢測機制

Eureka server和client之間每隔30秒會進行一次心跳通信,告訴server,client還活着
默認爲30秒,可在client配置進行配置

eureka: 
  instance:
    #eureka客戶端發送心跳給eureka服務器的時間間隔,表明它仍活着,默認30秒
    lease-renewal-interval-in-seconds: 5

自我保護機制

在某一些時候註冊在Eureka的服務已經掛掉了,但是服務卻還留在Eureka的服務列表的情況。
在Eureka圖形界面會有一行紅字,如下圖

因爲Eureka有自我保護機制,它在提醒你,實例列表可能存在不可用的實例

默認情況下,如果Eureka Server在一定時間內(默認90秒)沒有接收到某個微服務實例的心跳,Eureka Server將會移除該實例。

但是,如果在15分鐘內超過15%的客戶端節點都沒有正常的心跳,那麼Eureka就認爲客戶端與註冊中心出現了網絡故障,而微服務本身是正常運行的,此時不應該移除這個微服務,這就是自我保護機制

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

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

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

這裏引出兩個名詞:
Renews threshold:server期望在每分鐘中收到的心跳次數
Renews (last min):上一分鐘內收到的心跳次數。

前文說到禁止註冊server自己爲client,不管server是否禁止,threshold初始值是1。client個數爲n,threshold=1+2*n(此爲禁止自注冊的情況,這裏的乘以2是因爲默認每分鐘發兩次心跳)

如果是多個server,且開啓了自注冊,那麼就和client一樣,是對於其他的server來說就是client,client個數就得加上這個開啓了自注冊的server了

自注冊:自注冊指的是,當自身是Eureka Server時,向自己或別的Eureka Server進行註冊
對應註解爲register-with-eureka: true,默認爲true,表示是否將自己向Eureka Server進行註冊

現在開啓兩個Eureka Server(非自注冊),1個個Eureka Client,這兩個名詞數據顯示在Eureka圖形界面右側

threshold=1+21
renews = 2
1

當renews/threshold<0.85時,就會進入自我保護機制

這個保護機制有時會讓人難以琢磨,解決建議是:
1、在生產上可以開自注冊,部署多個server(這樣做是爲了增大renews)
2、簡單粗暴把自我保護模式關閉(開發或測試環境,建議生產開啓)

eureka:
  server:
    enable-self-preservation: false

分享給你的朋友!

THANDKS

  • End -

一個立志成大腿而每天努力奮鬥的年輕人

伴學習伴成長,成長之路你並不孤單!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章