1. 服务发现
- eureka 01 基础理论 有详细说明 eureka 服务发现,eureka 是如何获取到的增量数据的。
- 增量数据里面 是什么,不是很清晰。
1. 流程图
-
流程图 (2).jpg
2. 增量数据
// eureka-server AbstractInstanceRegistry.recentlyChangedQueue 属性 ------------
private static final class RecentlyChangedItem {
private long lastUpdateTime;
private Lease<InstanceInfo> leaseInfo;
public RecentlyChangedItem(Lease<InstanceInfo> lease) {
this.leaseInfo = lease;
lastUpdateTime = System.currentTimeMillis();
}
public long getLastUpdateTime() {
return this.lastUpdateTime;
}
public Lease<InstanceInfo> getLeaseInfo() {
return this.leaseInfo;
}
}
private ConcurrentLinkedQueue<RecentlyChangedItem> recentlyChangedQueue = new ConcurrentLinkedQueue<RecentlyChangedItem>();
- eureka-server 新注册的,续租等的服务 会存在在 recentlyChangedQueue队列中。
- recentlyChangedQueue 队列单独开一个定时任务, 去除调过期的数据
2.1 去除过期数据的方案 是通用的,像redis 之类。
-
- 获取数据的时候,去除掉过期数据。
-
- 定期删除,
- 每隔一段时间,扫描一遍数据。例如给目标单独开一个定时任务
- eureka 获取存量数据, 就是这样
-
- 定时删除
- 这里就是给队列里面的每个元素,创建一个定时器
- 耗cpou
// AbstractInstanceRegistry--------------------------
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;
}
}
}
};
}
- 所以增量获取的
- RetentionTimeInMSInDeltaQueue 内的毫秒数,最近 新注册的,续租等的服务。
网友评论