可以猜想一下,拉取注册表,肯定就两种,要么全量拉取,要么增量拉取,其实很多开源框架都是类似这样的思想
DiscoveryClient
DiscoveryClient
第一次进行注册的时候,会从服务端拉取全量注册表,会进到ApplicationsResource.getContainers()方法
ApplicationsResource
ResponseCacheImpl
到这里,我们发现了readOnlyCacheMap和readWriteCacheMap,使用了二级缓存,先从readOnlyCacheMap中获取,如果没有,再从readWriteCacheMap中获取后并加入readOnlyCacheMap,如果readWriteCacheMap都获取不到,则会从注册表去获取并放入readWriteCacheMap
那么,readWriteCacheMap是什么时候被初始化的?
在eureka server启动的时候,EurekaBootStrap类中第215行,serverContext.initialize() ----> registry.init(peerEurekaNodes) ----> initializedResponseCache()方法中找到了实例化ResponseCacheImpl,在构造方法中看到了readWriteCacheMap被构造出来
ResponseCacheImpl
可以看到readWriteCacheMap过期时间为180S,也就是说在180S内没有任何服务信息变更,会进行主动过期清除
再去看看增量拉取注册表,会走到ResponseCacheImpl.generatePayload()方法
ResponseCacheImpl
AbstractInstanceRegistry
这个recentlyChangedQueue队列中存放的是180S内服务变更的实例信息,由后台线程控制,只保留180S