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
相关文章
相关标签/搜索