2023-09-15
原文作者:王伟王胖胖 原文地址: 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秒才开始的哦,后续都会循环调度,而且延迟时间都是可调整的,所以为什么我们一开启服务不会马上注册到注册中心上。
还有一些细节下篇讲。

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

阅读全文