Eureka自我保護機制

2021-10-07 21:38:53 字數 1569 閱讀 9210

預設情況下,當eureka server在一定時間內沒有收到例項的心跳,便會把該例項從登錄檔中刪除(預設是90秒),但是,如果短時間內丟失大量的例項心跳,便會觸發eureka server的自我保護機制,比如在開發測試時,需要頻繁地重啟微服務例項,但是我們很少會把eureka server一起重啟(因為在開發過程中不會修改eureka註冊中心),當一分鐘內收到的心跳數大量減少時,會觸發該保護機制。可以在eureka管理介面看到renews threshold和renews(last min),當後者(最後一分鐘收到的心跳數)小於前者(心跳閾值)的時候,觸發保護機制,會出現紅色的警告:

從警告中可以看到,eureka認為雖然收不到例項的心跳,但它認為例項還是健康的,eureka會保護這些例項,不會把它們從登錄檔中刪掉。

該保護機制的目的是避免網路連線故障,在發生網路故障時,微服務和註冊中心之間無法正常通訊,但服務本身是健康的,不應該登出該服務,如果eureka因網路故障而把微服務誤刪了,那即使網路恢復了,該微服務也不會重新註冊到eureka server了,因為只有在微服務啟動的時候才會發起註冊請求,後面只會傳送心跳和服務列表請求,這樣的話,該例項雖然是執行著,但永遠不會被其它服務所感知。所以,eureka server在短時間內丟失過多的客戶端心跳時,會進入自我保護模式,該模式下,eureka會保護登錄檔中的資訊,不在登出任何微服務,當網路故障恢復後,eureka會自動退出保護模式。自我保護模式可以讓集群更加健壯。

但是我們在開發測試階段,需要頻繁地重啟發布,如果觸發了保護機制,則舊的服務例項沒有被刪除,這時請求有可能跑到舊的例項中,而該例項已經關閉了,這就導致請求錯誤,影響開發測試。

在開發測試階段,我們可以把自我保護模式關閉,只需在eureka server配置檔案中加上如下配置即可:

eureka.server.enable-self-preservation=false

在此基礎上還可以進一步配置eureka server清理無效節點的時間間隔

eureka.server.eviction-interval-timer-in-ms=10000 # 清理間隔(單位毫秒,預設是60*1000)

還可以在eureka client端配置開啟健康檢查,並按需配置續約更新時間和到期時間

eureka.client.healthcheck.enabled=true # 開啟健康檢查(需要spring-boot-starter-actuator依賴)

eureka.instance.lease-renewal-interval-in-seconds=30 # 續約更新時間間隔(預設30秒)

eureka.instance.lease-expiration-duration-in-seconds=60 # 續約到期時間(預設90秒)

但在生產環境,不會頻繁重啟,所以,一定要把自我保護機制開啟,否則網路一旦終端,就無法恢復。

一旦進入保護模式,eureka server將會嘗試保護其服務登錄檔中的資訊,不再刪除服務登錄檔中的資料(也就是不會登出任何微服務)。

Eureka自我保護機制

概念 預設情況下,eurekaclient會定時向eurekaserver端傳送心跳,如果eurekaserver在一定時間內沒有收到eurekaclient傳送的心跳,便會把該例項從註冊服務列表中剔除 預設是90秒 但是在短時間內丟失大量的例項心跳,這時候eurekaserver會開啟自我保護機制...

eureka自我保護機制

在eureka專案中看到乙個配置 renewal percent threshold。並不是很理解,就此學習一下eureka的自我保護機制。從這個配置說起,從字面角度來說就是心跳的百分比臨界值。我們都知道所有的服務都需要去向eureka伺服器進行註冊,並且維持心跳。這個欄位大概率和這個心跳的頻率有關...

Eureka自我保護機制

1.為什麼會產生eureka自我保護機制?為了防止eurekaclient可以正常進行,但是與eurekaserver網路不通情況下,eurekaserver不會立刻將eurekaclient服務剔除 2.什麼是自我保護模式 預設情況下,如果eurekaserver在一定時間內沒有接收到某個微服務例...