eureka 05 服务发现

1. 服务发现

  • eureka 01 基础理论 有详细说明 eureka 服务发现,eureka 是如何获取到的增量数据的。
  • 增量数据里面 是什么,不是很清晰。

1. 流程图

  • 流程图 (2).jpg

2. 增量数据

// eureka-server AbstractInstanceRegistry.recentlyChangedQueue 属性 ------------
    
    private static final class RecentlyChangedItem {
    private long lastUpdateTime;
    private Lease leaseInfo;

    public RecentlyChangedItem(Lease lease) {
        this.leaseInfo = lease;
        lastUpdateTime = System.currentTimeMillis();
    }

    public long getLastUpdateTime() {
        return this.lastUpdateTime;
    }

    public Lease getLeaseInfo() {
        return this.leaseInfo;
    }
}
    
    private ConcurrentLinkedQueue recentlyChangedQueue = new ConcurrentLinkedQueue();
    
  • eureka-server 新注册的,续租等的服务 会存在在 recentlyChangedQueue队列中。
  • recentlyChangedQueue 队列单独开一个定时任务, 去除调过期的数据

2.1 去除过期数据的方案 是通用的,像redis 之类。

    1. 获取数据的时候,去除掉过期数据。
    • 缺点 耗费内存
    1. 定期删除,
    • 每隔一段时间,扫描一遍数据。例如给目标单独开一个定时任务
    • eureka 获取存量数据, 就是这样
    1. 定时删除
    • 这里就是给队列里面的每个元素,创建一个定时器
    • 耗cpou
// AbstractInstanceRegistry--------------------------
    protected AbstractInstanceRegistry(EurekaServerConfig serverConfig, EurekaClientConfig clientConfig, ServerCodecs serverCodecs) {
        this.serverConfig = serverConfig;
        this.clientConfig = clientConfig;
        this.serverCodecs = serverCodecs;
        this.recentCanceledQueue = new CircularQueue>(1000);
        this.recentRegisteredQueue = new CircularQueue>(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 it = recentlyChangedQueue.iterator();
                while (it.hasNext()) {
                    if (it.next().getLastUpdateTime() <
                            System.currentTimeMillis() - serverConfig.getRetentionTimeInMSInDeltaQueue()) {
                        it.remove();
                    } else {
                        break;
                    }
                }
            }

        };
    }
  • 所以增量获取的
    • RetentionTimeInMSInDeltaQueue 内的毫秒数,最近 新注册的,续租等的服务。

你可能感兴趣的:(eureka 05 服务发现)