2023-09-15  阅读(0)
原文作者:王伟王胖胖 原文地址: https://blog.csdn.net/wangwei19871103/article/details/105612224

初始化基本流程图

202309152310212921.png

客户端初始化

客户端包括服务提供这和服务消费者,其实是一样的初始化流程,加的都是EnableDiscoveryClient注解。注意这里有一个自动注册的属性autoRegister,这个可以配置,而且会影响到客户端状态的。还有一个import就是用来自动注册用的,接下来我们来看看这个类EnableDiscoveryClientImportSelector

202309152310232412.png

EnableDiscoveryClientImportSelector

其实就是根据autoRegister属性,注册一个AutoServiceRegistrationConfiguration,来进行自动注册服务,我们先不讲这个,我们先讲客户端怎么初始化的。

202309152310244663.png

EurekaDiscoveryClientConfiguration

这里有个很重要的地方,初始化就是靠他,在他实例化的时候会注入EurekaClient

202309152310253144.png
注入的是CloudEurekaClient

202309152310258565.png

DiscoveryClient的构造方法

创建了心跳和缓存更新执行器,其实就是做续约和服务获取用的。

202309152310265156.png
然后进行开启:

202309152310273607.png

服务获取任务

这个就是我们配置文件属性eureka.client.fetch-registry=true的作用,开启一个定时器,主要是CacheRefreshThread类的run方法,后面会说。

202309152310286928.png

服务续约和注册

这个就是eureka.client.register-with-eureka=true的作用个,服务的注册,要注册就涉及到续约。所以有心跳续约任务,开启一个定时器,然后就是实例注册任务,这个是开一个调度任务,任务结束了继续调度,无限循环,这么做是为了控制调度的时间。

       if (clientConfig.shouldRegisterWithEureka()) {
                int renewalIntervalInSecs = instanceInfo.getLeaseInfo().getRenewalIntervalInSecs();
                int expBackOffBound = clientConfig.getHeartbeatExecutorExponentialBackOffBound();
                logger.info("Starting heartbeat executor: " + "renew interval is: {}", renewalIntervalInSecs);
    
                // 心跳任务
                heartbeatTask = new TimedSupervisorTask(
                        "heartbeat",
                        scheduler,
                        heartbeatExecutor,
                        renewalIntervalInSecs,
                        TimeUnit.SECONDS,
                        expBackOffBound,
                        new HeartbeatThread()
                );
                scheduler.schedule(
                        heartbeatTask,
                        renewalIntervalInSecs, TimeUnit.SECONDS);
    			// 注册任务
                // InstanceInfo replicator
                instanceInfoReplicator = new InstanceInfoReplicator(
                        this,
                        instanceInfo,
                        clientConfig.getInstanceInfoReplicationIntervalSeconds(),
                        2); // burstSize
    			//状态更新事件
                statusChangeListener = new ApplicationInfoManager.StatusChangeListener() {
                    @Override
                    public String getId() {
                        return "statusChangeListener";
                    }
    
                    @Override
                    public void notify(StatusChangeEvent statusChangeEvent) {
                        if (InstanceStatus.DOWN == statusChangeEvent.getStatus() ||
                                InstanceStatus.DOWN == statusChangeEvent.getPreviousStatus()) {
                            // log at warn level if DOWN was involved
                            logger.warn("Saw local status change event {}", statusChangeEvent);
                        } else {
                            logger.info("Saw local status change event {}", statusChangeEvent);
                        }
                        instanceInfoReplicator.onDemandUpdate();
                    }
                };
    
                if (clientConfig.shouldOnDemandUpdateStatusChange()) {
                    applicationInfoManager.registerStatusChangeListener(statusChangeListener);
                }
    
                // 调度注册任务
                instanceInfoReplicator.start(clientConfig.getInitialInstanceInfoReplicationIntervalSeconds());
            } else {
                logger.info("Not registering with Eureka server per configuration");
            }

InstanceInfoReplicator的start

就是调度自身的run方法。

202309152310293339.png
可以看到是循环调度的,只是时间可能会变,里面重要的是discoveryClient.register();这个才是注册到注册中心去。

2023091523103002310.png

注册服务,服务获取,服务续约都是延迟30秒才开始的哦,后续都会循环调度,而且延迟时间都是可调整的,所以为什么我们一开启服务不会马上注册到注册中心上。
还有一些细节下篇讲。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文