1. 程式人生 > >Spring Cloud Eureka 全解 (5)

Spring Cloud Eureka 全解 (5)

自我保護機制

關閉自我保護機制(預設是開啟的):eureka.server.enable-self-preservation=false

自我保護機制:預設情況下,如果Eureka Server在一定時間內沒有接收到某個微服務例項的心跳,Eureka Server將會登出該例項(預設90秒)。但是當網路分割槽故障發生時,微服務與Eureka Server之間無法正常通訊,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該登出這個微服務。

Eureka通過“自我保護模式”來解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時(可能發生了網路分割槽故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務登錄檔中的資訊,不再刪除服務登錄檔中的資料(也就是不會登出任何微服務)。當網路故障恢復後,該Eureka Server節點會自動退出自我保護模式。

綜上,自我保護模式是一種應對網路異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目登出任何健康的微服務。使用自我保護模式,可以讓Eureka叢集更加的健壯、穩定。

但是,在我們實際生產中,我們雲環境同一個Region下不會發生大規模網路分割槽狀況,所以沒有啟用自我保護。

相關引數:eureka.server.renewalPercentThreshold = 0.85

整體邏輯

image

在每一個服務例項註冊時:

expectedNumberOfRenewsPerMin += 2
numberOfRenewsPerMin
Threshold = RenewalPercentThreshold*numberOfRenewsPerMinThreshold

無論你設定心跳時間是多少,expectedNumberOfRenewsPerMin都是+2(預設心跳時間是30s,每分鐘有60s,所以+2,但是沒有根據真正的心跳時間修改,應該算是個缺陷

在收到心跳時:

renewsLastMin.increment()

renewsLastMin<numberOfRenewsPerMinThreshold,就會觸發自我保護,不會失效過期服務