【一起学源码-微服务】Nexflix Eureka 源码八:EurekaClient注册表抓取 精妙设计分析! (5)

AbstractInstanceRegistry.java具体代码如下:

protected AbstractInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs) { this.serverConfig = serverConfig; this.clientConfig = clientConfig; this.serverCodecs = serverCodecs; this.recentCanceledQueue = new CircularQueue<Pair<Long, String>>(1000); this.recentRegisteredQueue = new CircularQueue<Pair<Long, String>>(1000); this.renewsLastMin = new MeasuredRate(1000 * 60 * 1); this.deltaRetentionTimer.schedule(getDeltaRetentionTask(), serverConfig.getDeltaRetentionTimerIntervalInMs(), serverConfig.getDeltaRetentionTimerIntervalInMs()); } private TimerTask getDeltaRetentionTask() { return new TimerTask() { @Override public void run() { Iterator<RecentlyChangedItem> it = recentlyChangedQueue.iterator(); while (it.hasNext()) { if (it.next().getLastUpdateTime() < System.currentTimeMillis() - serverConfig.getRetentionTimeInMSInDeltaQueue()) { it.remove(); } else { break; } } } }; }

这里就能看明白了,也就是说增量抓取会获取EurekaServer端3分钟内保存的变动的Client信息。
最后还有一个亮点,我们上面说过,无论是全量抓取还是增量抓取,最后都会返回一个全量注册表的hash值,代码是apps.setAppsHashCode(allApps.getReconcileHashCode());, 其中apps就是返回的Applications中的属性,最后我们再看看这个hashCode的用法。

回到DiscoveryClient.java, 找到refreshRegistry 方法,然后一路跟踪到getAndUpdateDelta方法,这里具体代码我就不贴了,流程如下:

获取delta增量数据

根据增量数据和本地注册表数据进行合并

计算中本地注册表信息的hashCode值

如果本地hashCode值和server端返回的hashCode值不一致则再全量获取一次注册表信息

最后一张图总结增量注册表抓取逻辑:

06_EurekaClient增量抓取注册表流程.png

总结&感悟

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzyfsp.html