1. Eureka服务信息的延时问题
配置属性类 : org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean
-
服务下线后,Eureka不能及时更新
由于Eureka设计是基于著名的CAP理论中的AP原则设计,并不能保证强一致性
针对可能的异常情况,Eureka做了一些补偿处理:
- 应用实例异常挂掉,不能正常通知Eureka下线该服务实例信息。Eureka使用了 EvictionTask 的定时任务去剔除已下线的服务:
对于这种情况可以调整EvictionTask调度的频率(即缩短时间间隔),如下配置项:该包位于com.netflix.eureka.registry.AbstractInstanceRegistry.EvictionTask class EvictionTask extends TimerTask
//default 60000 eureka.server.eviction-interval-timer-in-ms=5000
- 应用实例有通知Eureka下线,但是由于Eureka Server 的Rest API中有response cache ,
对于这种情况可以选择关闭responseCache或者调整readWriteCacheMap的过期时间ResponseCache可以参照com.netflix.eureka.registry.ResponseCacheImpl#getCacheUpdateTask, 有两种一种是readWriteCacheMap,一种是readOnlyCacheMap。 因为eureka server对rest api提供了多级缓存,第一层是readOnlyCacheMap,最后是readWriteCacheMap,如果readWriteCacheMap读取不到,就会从registry(AbstractInstanceRegistry)进行读取; 其中readOnlyCacheMap会定时从readWriteCacheMap更新数据,而readWriteCacheMap有自己的过期时间,过期后自动从loader加载新数据。
//default true eureka.server.use-read-only-response-cache=false //default 180s eureka.server.response-cache-auto-expiration-in-seconds=60
- Eureka由于开启了SELF PRESERVATION模式,导致服务的register信息不会因为过期而被剔除掉,直到退出这个模式。
// default true //test或者dev设置成false,影响开发测试持续集成 eureka.server.enable-self-preservation=false //生产环境可以适当调小一些默认值,提高进入自我保护的门槛 //例如续约的时间间隔(default 30) 和 租约百分比(default 0.85) --15分钟内续订小于百分之85开启自我保护 eureka.instance.lease-renewal-interval-in-seconds=30 eureka.server.renewal-percent-threshold=0.49 eureka.server.renewal-threshold-update-interval-ms=15 //default值 15分钟
- 应用实例异常挂掉,不能正常通知Eureka下线该服务实例信息。Eureka使用了 EvictionTask 的定时任务去剔除已下线的服务:
-
服务上线后,Eureka client不能及时更新
测试环境可以适当提高Client端拉取服务注册信息的频率
//default 30 eureka.client.registry-fetch-interval-seconds=5
网友评论