文章目录
- 前言
- 一、Spring Cloud整合Eureka Client
- 1.1 @EnableEurekaClient注解
- 1.2 spring.factories文件
- 1.3 EurekaClientAutoConfiguration自动装配类
- 1.4 CloudEurekaClient构造方法
- 1.5 DiscoveryClient构造方法
- 1.6 DiscoveryClient#fetchRegistry
- 1.7 DiscoveryClient#getAndStoreFullRegistry
- 1.8 AbstractJerseyEurekaHttpClient#getApplications
- 1.9 DiscoveryClient#initScheduledTasks(定时任务初始化)
- 总结
前言
本文讲解
spring cloud
整合eureka client
并初始化的逻辑。
一、Spring Cloud整合Eureka Client
1.1 @EnableEurekaClient注解
这里可以发现这个注解只是个标识,并无其他意义,真正的自动装配逻辑在
client
的jar
包中的spring.factories
文件中。
1.2 spring.factories文件
这里发现自动装配了一些类,我们重点关注
EurekaClientAutoConfiguration
1.3 EurekaClientAutoConfiguration自动装配类
这里装配了很多组件,我们重点关注一下这个内部的配置类,这个
ApplicationInfoManager
就是管理当前实例的相关信息,重点在这里会装配一个EurekaClient
,我们看下他的构造方法
1.4 CloudEurekaClient构造方法
这里会设置一些属性,重点是调用父类的构造方法
1.5 DiscoveryClient构造方法
逻辑非常多,但重要步骤就两个:
1.去全量拉取注册表信息
2. 初始化相关的定时任务(增量拉取,服务续约)
1.6 DiscoveryClient#fetchRegistry
根据是否开启增量来判断进行全量拉取还是增量拉取,如果没启用增量或者是第一次拉取或者本地注册表时空的那么都会调用全量拉取注册表接口。
1.7 DiscoveryClient#getAndStoreFullRegistry
这里就是调用网络通信组件来发起网络请求了,这里默认是
AbstractJerseyEurekaHttpClient
1.8 AbstractJerseyEurekaHttpClient#getApplications
这里发现是调用服务端的
/apps
接口,也就对应之前我们讲解服务端的全量拉取接口。
1.9 DiscoveryClient#initScheduledTasks(定时任务初始化)
这里重要有三个步骤:
- 初始化增量拉取注册表定时任务
- 初始化客户端发送心跳定时任务
- 服务注册
1.9.1 CacheRefreshThread#run
这里直接调用了
DiscoveryClient#refreshRegistry
方法
1.9.1.1 DiscoveryClient#refreshRegistry
这里最终还是调用了
fetchRegistry
方法来进行远程拉取
1.9.2 HeartbeatThread#run
这里走的是renew方法请求服务续约,成功后会更新
lastSuccessfulHeartbeatTimestamp
字段
1.9.2.1 DiscoveryClient#renew
这里续约请求的接口就是
apps/{appName}/{instanceId}
,对应服务端的续约接口。
1.9.3 InstanceInfoReplicator$#start
这里重点关注创建了一个延迟任务,传入了自己,我们看下
InstanceInfoReplicator
的run
方法
1.9.3.1 InstanceInfoReplicator$#run
判断
dirtyTimestamp
不是null
的话,调用register
方法进行服务注册,这个时间戳肯定不是null
的,instanceInfo.setIsDirty()
;我们上面这个方法就是设置了这个时间戳。最后又将这个任务放入延时调度中。
其实这个定时任务是为了检测服务信息有没有变动,如果有变动重新注册到Eureka Server
上去。
总结
Eureka Client实例化有以下几个重点步骤
- 全量拉取注册表信息,放入本地
- 创建服务续约,增量拉取注册表,实例变更重新注册等一系列的定时任务