一般我们Client端会像下图一样,引入Eureka,下面就通过这个来分析Eureka客户端源码流程
一、客户端自动配置
这里import了一个EnableDiscoveryClientImportSelector类,这个类又做了什么?
就是加载了一些属性
二、SpringBoot 加载EurekaClientAutoConfiguration
SpringBoot会在启动的时候加载 spring-cloud-netflix-eureka-client端下面的META-INF下面的EurekaClientAutoConfiguration
让我们来看看这个类
三、EurekaClientAutoConfiguration详解
这里为什么要加入EurekaClientAutoConfiguration那?由于spring-cloud-eureka-server也需要进行网络通信,所以会引入Eureka Client包,最终会导致EurekaClientAutoConfiguration的导入
EurekaClientAutoConfiguration这个类通过 @configuration和@bean,引入了很多Eureka Client端源码中常见的组件
3.1 实例信息组件
3.2 实例管理组件
3.3 Eureka client实例
3.4 服务自动注册组件
3.5 服务注册组件
上面的服务自动注册组件,会调用到下面这个服务注册组件
四、Client端完整流程(最重要)
上面这些组件都准备好了,server端就要开始启动了,看看入口在哪里,有哪些流程?
4.1 服务注册
一般来说,client启动完成后,会向server端进行服务注册,这一步在那里?其实就是我们上面说的
EurekaAutoServiceRegistration
它的start会完成向服务端注册, 如果想继续追源码的话,它最终调用的是instanceInfoReplicator.onDemandUpdate();
这里是单线程异步执行的,因为scheduler核心线程数为1,然后submit给它的
- 调用discoveryClient.refreshInstanceInfo刷新实例信息
- 调用discoveryClient.register进行注册
- 调用sheduler.shedule 放一个下一次执行的延迟任务
最终,这里会调用到Server端的 ApplicationResource
这里又会调用到 PeerAwareInstanceRegistryImpl这个服务端组件的register方法
调用父类abstractInstanceRegistry的register完成注册,并且复制给其他node节点
这里就是eureka 最著名的三层缓存架构的注册表所在之处,我们看一下registry到底存了哪些信息?
<服务名:map<实例唯一id:InstanceInfo>>, 这就是一个注册中心底层原理
4.2 定时注册
4.3 服务发现(全量)
client在第一次启动的时候,会从eureka server全量的拉取注册表
入口在:
if (clientConfig.shouldFetchRegistry() && !fetchRegistry(false)) {
fetchRegistryFromBackup();
}
4.4 服务发现(定时)
4.3 心跳续约
在DiscoveryClient中,会创建定时调度的任务,去完成心跳续约