Eureka客户端初始化流程
2020-07-03 12:17:46 1 举报
Eureka 客户端注册实例以及发送心跳源码分析
作者其他创作
大纲/内容
自动分配
是
是否获取全量
判断shouldRegisterWithEureka与shouldFetchRegistry是否都为true
判断是否获取注册信息
SessionedEurekaHttpClient#sendHeartBeat
EurekaClientAutoConfiguration.RefreshableEurekaClientConfiguration#eurekaClient
HeartbeatThread执行流程
执行schedule.schedule()发布延时任务,重新开始执行TimedSupervisorTask
将初始化的调度器设置为空,返回,不执行定时任务
重新调用register()方法注册信息
SessionedEurekaHttpClient#execute
将applications放入到localRegionApps中
MetricsCollectingEurekaHttpClient#execute
发送请求到服务端
通过future获取任务执行结果
AbstractJerseyEurekaHttpClient#sendHeartBeat
执行cacheRefreshTask 子任务
请求地址http://localhost:10001/eureka/apps/API-PASSENGER/LIUHANLONG:api-passenger:8080?status=DOWN&lastDirtyTimestamp=1593670079461
抛出异常,失败
register()调用register注册节点信息
将applications放入到applications中
延时执行
创建EurekaClient
clientConfig.shouldRegisterWithEureka() && clientConfig.shouldEnforceRegistrationAtInit()若当前实例允许注册到eureka,并且开启了强制注册并初始化
执行heartbeatTask 子任务
否
com.netflix.discovery.DiscoveryClient#refreshRegistry
执行InstanceInfoReplicator 任务
初始化调度器
获取增量信息
利用executor提交任务
DiscoveryClient.EurekaTransport#bootstrapResolverDiscoveryClient.EurekaTransport#transportClientFactoryDiscoveryClient.EurekaTransport#registrationClientDiscoveryClient.EurekaTransport#registrationClientFactoryDiscoveryClient.EurekaTransport#queryClientDiscoveryClient.EurekaTransport#queryClientFactory
org.springframework.cloud.netflix.eureka.CloudEurekaClient
getAndStoreFullRegistry
注意:此3个调度器执行任务均为daemon 方式,所以若其他线程结束后,这些线程会自动结束
获取register信息
CacheRefreshThread执行流程
重要配置参数:eureka.client.registryFetchIntervalSeconds 拉取注册信息时间间隔eureka.client.fetchRegistry 是否拉取注册信息eureka.client.registerWithEureka 是否将实例注册到Eureka服务上eureka.instance.leaseRenewalIntervalInSeconds 发送心跳时间间隔eureka.instance.leaseExpirationDurationInSeconds 心跳超时时间,超时后移除实例eureka.instance.prefer-ip-address 优先使用ip地址注册
获取全量信息
EurekaHttpClientDecorator#getApplications
最终执行的构造函数
AbstractJerseyEurekaHttpClient#getApplicationsInternal
EurekaClientAutoConfiguration
SessionedEurekaHttpClient会定期(会话)强制执行完全重新连接,从而防止客户端永远坚持特定的Eureka服务器实例。 反过来,在集群拓扑发生变化的情况下,这也保证了负载的平均分配;这个特定时间是一个固定值的0.5-1.5倍的随机值
创建TimedSupervisorTask类型的cacheRefreshTask 实例包装CacheRefreshThread 的Runnable实例
1. 初始化调度器scheduler2. 心跳执行器heartbeatExecutor3. 获取缓存信息cacheRefreshExecutor
scheduler.schedule()执行调度任务,默认30秒后执行一次,可通过renewalIntervalInSecs 设置
1. localRegionApps 保存内容2. 增量保存调用getAndUpdateDelta 若返回值为空,则进行获取全量注册信息3. com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient#execute 通过numberOfRetries 控制重试次数,重试应该基于在配置文件中写的serviceUrl来获取,默认为3次;即若servcieUrl写了超过3个,则只有前3个会生效
判断detla中instance的actionType1. ActionType.ADDED2. ActionType.MODIFEID3. ActionType.DELETED根据以上三种类型,更新applications
否,表示注册失败
开始
spring-cloud-netflix-eureka-client-2.2.3.RELEASE.jar!/META-INF/spring.factoriesSPI方式 注册org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration
心跳任务
开始获取远程注册信息
注册当前实例
执行刷新注册信息
运行run()方法
经过多个EurekaHttpClientDecorator子类
com.netflix.servo.monitor.Stopwatch做调用计时
clientConfig.shouldRegisterWithEureka()判断是否当前实例注册到Eureka服务器
传递了当前的applications
com.netflix.discovery.DiscoveryClient#renew
执行刷新心跳
初始化EurekaTransport
clientConfig.shouldFetchRegistry() && !fetchRegistry(false)若shouldFetchRegistry为true,并且获取注册实例信息失败
创建TimedSupervisorTask类型的cheartbeatTask 实例包装HeartbeatThread 的Runnable实例
RetryableEurekaHttpClient#execute
启动调度任务TimedSupervisorTask
clientConfig.shouldFetchRegistry()
请求URI http://localhost:10001/eureka/apps/delta
若调用服务端返回302重定向,则由此处设置转发target地址,通过RedirectingEurekaHttpClient#MAX_FOLLOWED_REDIRECTS设置最大重定向次数
请求URI http://localhost:10001/eureka/apps
getAndUpdateDelta(Applications)
fetchRegistry(forceFullRegistryFetch)
Status.NOT_FOUND
发送请求URI
初始化Bean
重试一下流程,最多重试3次
fetchRegistryFromBackup()获取备份信息通过方法
封装返回获取的到全量applications,并包装成EurekaHttpResponse<Applications>
RedirectingEurekaHttpClient#execute
scheduler.schedule()执行调度任务,默认30秒后执行一次,可通过registryFetchIntervalSeconds设置
0 条评论
下一页
为你推荐
查看更多