Eureka自我保護模式——難點重點
一、開啟Eureka自我保護模式
訪問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的自我保護模式是啟動的。
解決這種情況的方法主要有幾種方式:
1. 等待 Eureka Server 自動恢復
正常的情況下,等待網路恢復(或者沒有頻繁的啟動與關閉例項)後,等待一段時間 Eureka Server 會自動關閉自我保護模式,但是如果它遲遲沒有關閉該模式,那麼便可以嘗試手動關閉,如下。
2. 重啟 Eureka Server
通常而言,PRD 環境建議對 Eureka Server 做負載均衡,這樣在依次關閉並開啟 Eureka Server 後,無效的例項會被清除,並且不會對正常的使用照成影響。
3. 關閉 Eureka 的自我保護模式
後面介紹
二、Eureka自我保護模式原理
預設情況下,如果在15分鐘內超過85%的客戶端節點都沒有正常的心跳,那麼Eureka就認為客戶端與註冊中心出現了網路故障(比如網路故障或頻繁的啟動關閉客戶端),Eureka Server自動進入自我保護模式。不再剔除任何服務,當網路故障恢復後,該節點自動退出自我保護模式。
eureka: server: #自我保護模式,當出現網路分割槽故障、頻繁的開啟關閉客戶端、eureka在短時間內丟失過多客戶端時,會進入自我保護模式,即一個服務長時間沒有傳送心跳,eureka也不會將其刪除,預設為trueenable-self-preservation: true #eureka server清理無效節點的時間間隔,預設60000毫秒,即60秒 eviction-interval-timer-in-ms: 60000 #閾值更新的時間間隔,單位為毫秒,預設為15 * 60 * 1000 renewal-threshold-update-interval-ms: 15 * 60 * 1000 #閾值因子,預設是0.85,如果閾值比最小值大,則自我保護模式開啟 renewal-percent-threshold: 0.85 #清理任務程式被喚醒的時間間隔,清理過期的增量資訊,單位為毫秒,預設為30 * 1000 delta-retention-timer-interval-in-ms: 30000
自我保護模式是一種對網路異常的安全保護措施。使用自我保護模式讓Eureka叢集更加的健壯、穩定。
三、關閉 Eureka 的自我保護模式
可以使用eureka.server.enable-self-preservation=false來禁用自我保護模式,適合在開發/測試環境中使用,生產環境建議開啟自我保護模式。
對於開發/測試環境的 Eureka Server,個人更建議關閉它的自我保護模式,因為你可能需要不斷的開啟與關閉例項,如果並未關閉自我保護模式,那麼很容易就會觸發自我保護模式,此時對除錯會相對比較麻煩。
但是關閉自我保護模式,會有另外一個可能的問題,即隔一段時間後,可能會發生例項並未關閉,卻無法通過閘道器訪問了,此時很可能是由於網路問題,導致例項(或閘道器)與 Eureka Server 斷開了連線,Eureka Server 已經將其登出(網路恢復後,例項並不會再次註冊),此時重啟 Eureka Server 節點或例項,並等待一小段時間即可。
關閉自我保護模式,可以在服務端和客戶端配置。
服務端配置:
eureka:
server:
enable-self-preservation: false
#eureka server清理無效節點的時間間隔,預設60000毫秒,即60秒
eviction-interval-timer-in-ms: 60000 # 單位毫秒
客戶端配置:
# 心跳檢測檢測與續約時間
# 測試時將值設定設定小些,保證服務關閉後註冊中心能及時踢出服務
eureka:
instance:
lease-renewal-interval-in-seconds: 1
lease-expiration-duration-in-seconds: 2
配置說明
lease-renewal-interval-in-seconds 每間隔1s,向服務端傳送一次心跳,證明自己依然”存活“。 lease-expiration-duration-in-seconds 告訴服務端,如果我2s之內沒有給你發心跳,就代表我“死”了,請將我踢掉。
四、Eureka的健康檢查
說明:在Status欄顯示著UP,表示應用程式狀態正常。其它取值DOWN、OUT_OF_SERVICE、UNKNOWN等,只有UP的微服務會被請求。
由於Eureka Server與Eureka Client之間使用心跳機制來確定Eureka Client的狀態,預設情況下,伺服器端與客戶端的心跳保持正常,應用程式就會始終保持“UP”狀態,所以微服務的UP並不能完全反應應用程式的狀態。
Spring Boot Actuator提供了/health端點,該端點可展示應用程式的健康資訊,只有將該端點中的健康狀態傳播到Eureka Server就可以了,實現這點很簡單,只需為微服務配置如下內容:
#開啟健康檢查(需要spring-boot-starter-actuator依賴)
eureka.client.healthcheck.enabled = true
如果需要更細粒度健康檢查,可實現com.netflix.appinfo.HealthCheckHandler介面 。 EurekaHealthCheckHandler 已實現了該介面