可以猜想一下桐早,拉取注冊表逊笆,肯定就兩種栈戳,要么全量拉取,要么增量拉取难裆,其實很多開源框架都是類似這樣的思想
第一次進(jìn)行注冊的時候子檀,會從服務(wù)端拉取全量注冊表镊掖,會進(jìn)到ApplicationsResource.getContainers()方法
到這里,我們發(fā)現(xiàn)了readOnlyCacheMap和readWriteCacheMap,使用了二級緩存褂痰,先從readOnlyCacheMap中獲取亩进,如果沒有,再從readWriteCacheMap中獲取后并加入readOnlyCacheMap缩歪,如果readWriteCacheMap都獲取不到归薛,則會從注冊表去獲取并放入readWriteCacheMap
那么,readWriteCacheMap是什么時候被初始化的匪蝙?
在eureka server啟動的時候主籍,EurekaBootStrap類中第215行,serverContext.initialize() ----> registry.init(peerEurekaNodes) ----> initializedResponseCache()方法中找到了實例化ResponseCacheImpl,在構(gòu)造方法中看到了readWriteCacheMap被構(gòu)造出來
可以看到readWriteCacheMap過期時間為180S逛球,也就是說在180S內(nèi)沒有任何服務(wù)信息變更千元,會進(jìn)行主動過期清除
再去看看增量拉取注冊表,會走到ResponseCacheImpl.generatePayload()方法
這個recentlyChangedQueue隊列中存放的是180S內(nèi)服務(wù)變更的實例信息颤绕,由后臺線程控制幸海,只保留180S