從入口按順序:緩存
eureka-client
獲取服務對應的節點列表,存儲在本地緩存;經過定時任務,定時刷新緩存數據,定時任務默認30秒執行一次。Eureka-Client:spa
eureka-server
獲取服務列表,存入本地緩存,定時任務默認30秒執行一次。code
跟本地生成的code
作比較,若是不一致,就調用全量接口從新獲取全部服務。續租/renew
,默認30秒一次。Eureka-Server:code
緩存:共三級緩存,能夠經過配置關閉第一級緩存,默認是開啓。server
readOnlyCacheMap
:經過定時任務,定時從二級緩存中獲取數據並刷新當前值,定時任務默認30秒執行一次。readWriteCacheMap
:經過guava cache
實現緩存機制,默認是從寫入時間起算,30秒以後過時
;服務信息有變更時,會實時修改二級緩存數據(其實是清理掉緩存,下次讀取數據時,會從下一級獲取數據並存儲緩存)。registry
:從不一樣維度存儲服務信息(好比ALL_APPS
存儲全部服務列表,ALL_APPS_DELTA
存儲最新變動列表,服務名
存儲服務對應的信息列表);服務信息有變更時,會實時修改數據。下線:定時任務定時清理長時間未續租/renew
的節點。blog
續租/renew
的節點。總體流程以下:接口
相關配置:
Ribbon:進程
配置參數 | 默認(秒) | 說明 |
---|---|---|
ribbon.ServerListRefreshInterval | 30 | 本地服務列表緩存更新週期 |
Euraka-Client:get
配置參數 | 默認(秒) | 說明 |
---|---|---|
eureka.client.registryFetchIntervalSeconds | 30 | 本地服務列表緩存更新週期,(正常狀況下增量更新,第一次或與 Server 端不一致等狀況則全量更新) |
eureka.instance.leaseRenewalIntervalInSeconds | 30 | 續約週期 |
Euraka-Server:it
配置參數 | 默認(秒) | 說明 |
---|---|---|
eureka.server.useReadOnlyResponseCache | true | 是否開啓readOnlyCacheMap 緩存 |
eureka.server.responsecCacheUpdateIntervalMs | 30 | readOnlyCacheMap 緩存更新週期 |
eureka.server.evictionIntervalTimerInMs | 60 | 清理/下線長時間未續租節點週期 |
eureka.instance.leaseExpirationDurationInSeconds | 90 | 未續租節點超時時間,超過這個時間,就會被清理任務清理掉 |
默認配置下服務消費者最長感知時間:io
Eureka-Client | 時間(秒) | 說明 |
---|---|---|
上線 | 30(readOnly)+30(Client)+30(Ribbon)=90 | readWrite -> readOnly -> Client -> Ribbon 各 30s |
正常下線 | 30(readonly)+30(Client)+30(Ribbon)=90 | 服務正常下線(kill 或 kill -15 殺死進程)會給進程善後機會,<br/>DiscoveryClient.shutdown() 將向 Server 更新自身狀態爲 DOWN,<br/>而後發送 DELETE 請求註銷本身,registry 和 readWriteCacheMap 實時更新,故 UI 將再也不顯示該服務實例 |
非正常下線 | 60+90+30+30+30=240 | 服務非正常下線(kill -9 殺死進程或進程崩潰)不會觸發 DiscoveryClient.shutdown() 方法,<br/>Eureka Server 將依賴每 60s 清理超過 90s 未續約服務從 registry 和 readWriteCacheMap 中刪除該服務實例 |
考慮以下狀況:
因爲eureka-server
分批下線機制(最多25%),若是同時有大批量節點下線的話(超過25%,未達到自我保護機制閾值,或者未開啓自我保護機制),有的服務節點還會超過240秒。
參考:
《 詳解Eureka緩存機制》