1、常見問題
- 1、為什么服務下線了,Eureka Server接口返回的信息還會存在?
- 2、為什么服務上線了,Eureka Client不能及時獲取到?
- 3、為什么偶爾會有如下提示:
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RENOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE
2、解決方法
- 針對第一個問題,Eureka Server並不是強一致的,因此registry中會存留已過期的實例信息,有一下幾個原因:
- 1、應用實例異常掛掉,沒能在掛掉之前告知Eureka Server要下線該服務實例信息。這種情況下就需要依賴Eureka Server的EvictionTask去剔除。
- 2、應用實例下線時有告知Eureka Server下線,但是由於Eureka Server的REST API有response cache,因此需要等待緩存過期才能更新。
- 3、Eureka Server由於開啟並引入了SELF PRESERVATION模式,導致registry的信息不會因為過期而被剔除掉,直到退出SELF PRESERVATION模式。
- 針對第二個問題,可以調整EvictionTask的調度頻率,比如下面的配置,將調度間隔默認的60秒,調整為15秒:
eureka.server.eviction-interval-timer-in-ms=5000
-
針對response cache的問題,可以根據情況考慮關閉readOnlyCacheMap:
eureka.server.use-read-only-response-cache=false
-
或者調整readWriteCacheMap的過期時間:
eureka.server.response-cache-auto-expiration-in-seconds=60
-
針對SELF PRESERVATION的問題,在測試環境可以將enable-self-preservation設置為false:
eureka.server.enable-self-preservation=false
-
關閉的話,則會提示:
RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
或者:
THE SELF PRESERVATION MODE IR TURED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
- 針對新服務上線,Eureka Client獲取不及時的問題,在測試環境,可以適當提高Client端拉取Server注冊信息的頻率,例如下面將默認的30秒改為15秒:
eureka.client.registry-fetch-interval-seconds=5
- 針對SELF PRESERVATION問題,在實際生產過程中,經常會有網絡抖動等問題,造成服務實例與Eureka Server的心跳未能如期保持,但是服務實例本身是健康的,這個時候如果按照租約機制剔除的話,會造成誤判,如果大范圍誤判的話,可能會導致整個服務列表中的大部分注冊信息被剔除,從而導致沒有可用服務。Eureka為了解決這個問題引入可SELF PRESERVATION機制,當最近一分鍾接受到的續約的次數小於等於指定閥值的話,則關閉續約失效剔除,禁止定時任務剔除失效的實例,從而保護注冊信息,對於開發測試環境,開啟這個機制有時候反而會影響系統的持續集成,因此可以通過如下參數關閉該機制:
eureka.server.enable-self-preservation=false
在生產環境中,可以把renewalPercentThreshold及leaseRenewalIntervalInSeconds參數調小一點,進而提高SELF PRESERVATION機制的門檻,比如:
eureka.instance.lease-renewal-interval-in-seconds=10 eureka.server.renewal-percent-threshold=0.49