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<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 之类。

    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<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 内的毫秒数,最近 新注册的,续租等的服务。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容