eureka 服務實例實現快速下線快速感知快速刷新配置解析

Spirng Eureka 默認配置解讀緩存

默認的Spring Eureka服務器,服務提供者和服務調用者配置不夠靈敏,老是服務提供者在停掉好久以後,服務調用者很長時間並無感知到變化。或者是服務已經註冊上去了,可是服務調用方很長時間仍是調用不到,發現不了這個服務。服務器

 

Spring Eureka 默認配置下:spa

描述以下:code

  1. EurekaServer默認有兩個緩存,一個是ReadWriteMap,另外一個是ReadOnlyMap。有服務提供者註冊服務或者維持心跳時時,會修改ReadWriteMap。當有服務調用者查詢服務實例列表時,默認會從ReadOnlyMap讀取(這個在原生Eureka能夠配置,SpringCloud Eureka中不能配置,必定會啓用ReadOnlyMap讀取),這樣能夠減小ReadWriteMap讀寫鎖的爭用,增大吞吐量。EurekaServer定時把數據從ReadWriteMap更新到ReadOnlyMap中。ReadWriteMap是一個Guava Cache,過時時間是能夠配置的。
  2. 服務提供者註冊服務後,會定時心跳。這個根據服務提供者的Eureka配置中的服務刷新時間決定。還有個配置是服務過時時間,這個配置在服務提供者配置可是在EurekaServer使用了,可是默認配置EurekaServer不會啓用這個字段。須要配置好EurekaServer的掃描失效時間,纔會啓用EurekaServer的主動失效機制。在這個機制啓用下:每一個服務提供者會發送本身服務過時時間上去,EurekaServer會定時檢查每一個服務過時時間和上次心跳時間,若是在過時時間內沒有收到過任何一次心跳,同時沒有處於保護模式下(參考第一篇的Eureka自我保護機制),則會將這個實例從ReadWriteMap中去掉。
  3. 在默認沒有啓用EurekaServer主動失效服務實例的狀況下,服務過時是利用ReadWriteMap超時緩存失效實現的,只有發送心跳的實例緩存不會失效。
  4. 服務調用者有本地緩存,定時從Eureka服務器上增量拉取全部服務實例列表

緣由分析

 

服務提供者和服務調用者配置不夠靈敏,老是服務提供者在停掉好久以後,服務調用者很長時間並無感知到變化的緣由:
EurekaServer本身的ReadWriteMap緩存失效延遲,刷新到ReadOnlyMap的延遲,服務調用者本身本地緩存刷新的延遲。server

 

服務已經註冊上去了,可是服務調用方很長時間仍是調用不到,發現不了這個服務:
刷新到ReadOnlyMap的延遲,服務調用者本身本地緩存刷新的延遲blog

解決方案

EurekaServer修改以下配置:it

 1 #eureka server刷新readCacheMap的時間,注意,client讀取的是readCacheMap,這個時間決定了多久會把readWriteCacheMap的緩存更新到readCacheMap上
 2 #默認30s
 3 eureka.server.responseCacheUpdateIntervalMs=3000
 4 #eureka server緩存readWriteCacheMap失效時間,這個只有在這個時間過去後緩存纔會失效,失效前不會更新,過時後從registry從新讀取註冊服務信息,registry是一個ConcurrentHashMap。
 5 #因爲啓用了evict其實就用不太上改這個配置了
 6 #默認180s
 7 eureka.server.responseCacheAutoExpirationInSeconds=180
 8 
 9 #啓用主動失效,而且每次主動失效檢測間隔爲3s
10 eureka.server.eviction-interval-timer-in-ms=3000

Eureka服務提供方修改以下配置:io

1 #服務過時時間配置,超過這個時間沒有接收到心跳EurekaServer就會將這個實例剔除
2 #注意,EurekaServer必定要設置eureka.server.eviction-interval-timer-in-ms不然這個配置無效,這個配置通常爲服務刷新時間配置的三倍
3 #默認90s
4 eureka.instance.lease-expiration-duration-in-seconds=15
5 #服務刷新時間配置,每隔這個時間會主動心跳一次
6 #默認30s
7 eureka.instance.lease-renewal-interval-in-seconds=5!

Eureka服務調用方修改以下配置:class

1 #eureka client刷新本地緩存時間
2 #默認30s
3 eureka.client.registryFetchIntervalSeconds=5
4 #eureka客戶端ribbon刷新時間
5 #默認30s
6 ribbon.ServerListRefreshInterval=5000
相關文章
相關標籤/搜索