
現在由于eureka服務越來越多,發現服務提供者在停掉很久之後,服務調用者很長時間并沒有感覺到變化,依舊還在持續調用下線的服務,導緻長時間後才能傳回錯誤,是以需要調整eureka服務和用戶端的配置,以便實作服務下線後快速感覺。
需要調整服務注冊中心、服務提供者和服務消費者三個配置。
服務注冊中心EurekaServer
先上要更改的配置:
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 啟用主動失效,并且每次主動失效檢測間隔為5s
Eureka Server會定時(間隔值是eureka.server.eviction-interval-timer-in-ms,預設值為0,預設情況不删除執行個體)進行檢查,如果發現執行個體在在一定時間(此值由用戶端設定的eureka.instance.lease-expiration-duration-in-seconds定義,預設值為90s)内沒有收到心跳,則會登出此執行個體。
有些文檔指出還需要設定下面的兩個參數(上下兩種寫法),但都測試後暫時沒發現什麼強關聯性,這裡暫時先不設定。
Eureka服務提供方、Eureka服務調用方修改如下配置:
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更新此執行個體的狀态。
lease-expiration-duration-in-seconds 設定服務過期時間配置,超過這個時間沒有接收到心跳EurekaServer就會将這個執行個體剔除,一般是lease-renewal-interval-in-seconds的3倍。
Eureka Server會定時(間隔值是eureka.server.eviction-interval-timer-in-ms,預設值為0,預設情況不删除執行個體)進行檢查,如果發現執行個體在在一定時間(此值由eureka.instance.lease-expiration-duration-in-seconds定義,預設值為90s)内沒有收到心跳,則會登出此執行個體。
經過測試設定4s上報一次心跳,12s内無跳就讓注冊中心剔除服務比較合理,上報時間若為2s,1000個服務會造成對注冊中心請求的壓力,且2s有可能網絡抖動,整個時長6s無響應就判為下線會造成并發壓力。
消費端為了能快速響應服務請求會從Eureka Server拉取服務位址清單後緩存到本地(後面會增量擷取),fetch-registry要設定為true,定期的更新用戶端的服務清單時間 registry-fetch-interval-seconds: 8,這是消費端的設定。
測試總結
- 隻設定服務端Eureka Server的配置是無效的,還需要設定用戶端來配合。
- 調用方通路一個在注冊中心不存在服務ID響應是非常快的,但如果通路一個ID還存在,但對應ip服務已經挂了的服務就是404,長時間無響應。
- 服務提供者程序意外退出或服務完全卡住(是整個服務無法響應)情況是一樣的,都是在指定服務的lease-expiration-duration-in-seconds時間内無心跳就會從注冊中心剔除。
- 注冊中心把服務剔除後,調用方還需要時間重新整理到本地緩存。