Spring Cloud Eureka 全解 (5) - 自我保護機制

本文基於SpringCloud-Dalston.SR5spring

自我保護機制

關閉自我保護機制(默認是打開的):eureka.server.enable-self-preservation=false安全

自我保護機制:默認狀況下,若是Eureka Server在必定時間內沒有接收到某個微服務實例的心跳,Eureka Server將會註銷該實例(默認90秒)。可是當網絡分區故障發生時,微服務與Eureka Server之間沒法正常通訊,以上行爲可能變得很是危險了——由於微服務自己實際上是健康的,此時本不該該註銷這個微服務。網絡

Eureka經過「自我保護模式」來解決這個問題——當Eureka Server節點在短期內丟失過多客戶端時(可能發生了網絡分區故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,Eureka Server就會保護服務註冊表中的信息,再也不刪除服務註冊表中的數據(也就是不會註銷任何微服務)。當網絡故障恢復後,該Eureka Server節點會自動退出自我保護模式。架構

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

可是,在咱們實際生產中,咱們雲環境同一個Region下不會發生大規模網絡分區情況,因此沒有啓用自我保護。code

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

總體邏輯

image

在每個服務實例註冊時:blog

expectedNumberOfRenewsPerMin += 2
numberOfRenewsPerMinThreshold = RenewalPercentThreshold*numberOfRenewsPerMinThreshold

不管你設置心跳時間是多少,expectedNumberOfRenewsPerMin都是+2(默認心跳時間是30s,每分鐘有60s,因此+2,可是沒有根據真正的心跳時間修改,應該算是個缺陷rem

在收到心跳時:get

renewsLastMin.increment()

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

相關文章
相關標籤/搜索