开发环境下, 比如A服务调用B服务, B服务更改代码重启后, A服务足足要等上一两分钟才能正常调用到B服务
无疑是浪费生命
技术架构是Eureka+OpenFeign+Ribbon
Ribbon配置
Ribbon调用这个方法启动了一个定时器, 该定时器定期刷新ribbon内缓存的服务列表
com.netflix.loadbalancer.PollingServerListUpdater#start
# ribbon缓存刷新间隔
ribbon.ServerListRefreshInterval=1000
Eureka Client配置
Client会定时向Server获取服务注册信息
同样是定时调用
com.netflix.discovery.DiscoveryClient#initScheduledTasks
通过此参数配置
# 客户端拉取服务器配置信息的周期
eureka.client.registry-fetch-interval-seconds=1
此任务实际调用了http://host/eureka/apps/delta
这个接口获取服务注册列表, 但这个接口, 同样是有缓存的, 继续看Server配置
Eureka Server配置
Eureka Server存在三个变量: ( registry / readWriteCacheMap / readOnlyCacheMap ) 保存服务注册信息
默认情况下定时任务每30s将readWriteCacheMap同步至readOnlyCacheMap, 每60s清理超过90s未续约的节点, Eureka Client每30s从readOnlyCacheMap获取服务注册信息
# 禁用readOnlyCacheMap, client直接从readWriteCacheMap更新服务注册信息
eureka.server.use-read-only-response-cache: false
在此判断是否取缓存
com.netflix.eureka.registry.ResponseCacheImpl#getValue
更改了配置后, B服务启动仅1-2s内就可以被A服务感知到
但这些配置建议仅在开发环境下启用
注意: 本文归作者所有, 未经作者允许, 不得转载. 若有谬误, 欢迎指出