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值不一致则再全量获取一次注册表信息
最后一张图总结增量注册表抓取逻辑:
总结&感悟