如今因爲eureka服務愈來愈多,發現服務提供者在停掉好久以後,服務調用者很長時間並無感知到變化,依舊還在持續調用下線的服務,致使長時間後才能返回錯誤,所以須要調整eureka服務和客戶端的配置,以便實現服務下線後快速感知。緩存
須要調整服務註冊中心、服務提供者和服務消費者三個配置。網絡
先上要更改的配置:併發
eureka:
server: #配置屬性,但因爲 Eureka 自我保護模式以及心跳週期長的緣由,常常會遇到 Eureka Server 不剔除已關停的節點的問題
enable-self-preservation: false # 設爲false,關閉自我保護
eviction-interval-timer-in-ms: 5000 # 清理間隔(單位毫秒,默認是60*1000)啓用主動失效,而且每次主動失效檢測間隔爲3s
1.先要關閉自我保護 enable-self-preservation: false測試
2.eviction-interval-timer-in-ms 啓用主動失效,而且每次主動失效檢測間隔爲5sfetch
Eureka Server會定時(間隔值是eureka.server.eviction-interval-timer-in-ms,默認值爲0,默認狀況不刪除實例)進行檢查,若是發現實例在在必定時間(此值由客戶端設置的eureka.instance.lease-expiration-duration-in-seconds定義,默認值爲90s)內沒有收到心跳,則會註銷此實例。spa
有些文檔指出還須要設置下面的兩個參數(上下兩種寫法),但都測試後暫時沒發現什麼強關聯性,這裏暫時先不設置。3d
eureka: instance: prefer-ip-address: true lease-renewal-interval-in-seconds: 4 lease-expiration-duration-in-seconds: 12 client: serviceUrl: defaultZone: http://localhost:1025/eureka fetch-registry: true registry-fetch-interval-seconds: 8
客戶端經過eureka.instance.lease-renewal-interval-in-seconds 每隔這個時間會主動心跳一次,默認值爲30s,更新本身的狀態。Eureka Server收到心跳後,會通知集羣裏的其它Eureka Server更新此實例的狀態。code
lease-expiration-duration-in-seconds 設置服務過時時間配置,超過這個時間沒有接收到心跳EurekaServer就會將這個實例剔除,通常是lease-renewal-interval-in-seconds的3倍。server
Eureka Server會定時(間隔值是eureka.server.eviction-interval-timer-in-ms,默認值爲0,默認狀況不刪除實例)進行檢查,若是發現實例在在必定時間(此值由eureka.instance.lease-expiration-duration-in-seconds定義,默認值爲90s)內沒有收到心跳,則會註銷此實例。
通過測試設置4s上報一次心跳,12s內無跳就讓註冊中心剔除服務比較合理,上報時間若爲2s,1000個服務會形成對註冊中心請求的壓力,且2s有可能網絡抖動,整個時長6s無響應就判爲下線會形成併發壓力。blog
消費端爲了能快速響應服務請求會從Eureka Server拉取服務地址清單後緩存到本地(後面會增量獲取),fetch-registry要設置爲true,按期的更新客戶端的服務清單時間 registry-fetch-interval-seconds: 8,這是消費端的設置。