上一篇文章我们对eureka的服务端启动流程做了大致的源码剖析,接下来我们对eureka的客户端进行一下源码剖析看看他里面做了些什么事情
首先我们和上一篇文章一样,看看启动类上添加的注解org.springframework.cloud.netflix.eureka.EnableEurekaClient里面有没有什么信息可以获取
有点失望,这里面什么也没有,空空如也,那我们再去看看eureka的类路径下有没有配置客户端的自动装配相关信息
嗯,这个类和服务端自动装配的名称很像,是不是就是他呢,咱们点进去看看这里面的内容我们进入到org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration里面看看
哟熟悉的味道啊,这里也整了一个条件marker而且这个marker也是在一个配置类的内部类,而且我们还发现这里还有一个@AutoConfigureAfter注解,注解中正好也配置了这个配置类,这个注解的意思就是在注解加里面的类都注入完之后再对添加该注解的类进行注入。那么我们进入这个配置类org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration里看看里面又做了啥
o my good,这里也是熟悉的味道啊,简简单单就把这个空的marker创建了然后交给spring容器。
嗯?这些参数是不是很熟悉啊,这不是咱们在客户端的配置文件中配置的信息吗,他这里把配置文件解析出来分装到了一个org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean中然后交个IOC容器
再往下看我们可以看到他在自己的内部类org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration.EurekaClientConfiguration中注入了com.netflix.discovery.EurekaClient
我们来看一下org.springframework.cloud.netflix.eureka.CloudEurekaClient里又做了啥
我们点击进入父类com.netflix.discovery.DiscoveryClient的构造方法中看看里面做了啥,这时候来到了com.netflix.discovery.DiscoveryClient#DiscoveryClient()方法中,咋一看
又调用自己的构造方法,咱们继续跟进
到这里我们就发现他开始做事情了,我们重点关注途中标红数字的地方
1、从注册中心中获取列表信息
点进com.netflix.discovery.DiscoveryClient#fetchRegistry方法中
可以看到这里获取可以全量获取或者增量获取列信息,咱们先看看全量获取是怎么获取的
这里我们可以发现他是使用com.netflix.discovery.shared.transport.EurekaHttpClient进行查找的,而这个client又有四个实现类,那咱们应该用哪个类的查找方法呢?通过上一篇文章我们可以知道,在eureka服务端启动流程中注入了jersey框架,这个框架就是用来处理rest请求的,所以客户端发送请求的是有也是使用jersey进行请求发送。
因此我们进入到com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient#getApplications中看看里面做了啥
继续跟进
可以看到这里就是使用jerseyClient进行资源获取,然后将返回的结果进行加工并返回。到这里全量获取就算是完事了。
接下来我们看一下增量获取的
可以看到这里就直接使用Jersey获取增量,然后看看是否有增量数据,如果没有直接去获取全量信息,如果有增量信息,更新增量信息到本地
到这里增量获取也看完了接下来我们回到DiscoveryClient中看看他接下来要做什么
2、注册自己
这里同样使用com.netflix.discovery.shared.transport.jersey.AbstractJerseyEurekaHttpClient发送请求请求注册
到这里我们注册流程也看完了,我们继续回到DiscoveryClient中看看接下来干什么了
3、初始化⼀些定时任务(⼼跳续约,刷新本地服务缓存列表)
可以看到授信定义刷新本地缓存定时任务
可以看到这里还是调用的是获取列表信息方法我们再点进去看看
从上面两张图联合可以看出,在定时任务执行过程中,如果远程区域发生了变动,他这里是使用的全量更新,也就是丢弃本地缓存
那么这个定时任务多久执行一次呢?
从org.springframework.cloud.netflix.eureka.EurekaClientConfigBean配置类中我们可以看到时间间隔是30s
接下来是初始化心跳(续约)定时任务
这里的定时任务的间隔也是30s
从上面两张图我们可以发现他也是使用jersey发送请求。然后判断是否找到对应的服务信息,如果找不到,再重新注册一次
上面我们看完了客户端主动查询、注册、心跳相关的源码,接下来我们看一下注销的源码,这个源码在哪里呢?我们回到EurekaClientAutoConfiguration中
看到这个熟悉spring声明周期的同学们应该都不陌生,就是告诉容器,这个eurekaClient对象销毁的时候需要执行shutdown方法。接下来我们就来看看shutdown这个方法具体代码
可以看到这个方法中主要就是把一些监听器关闭,然后取消定时任务,然后调用了一下unregister方法
老套路,使用jersey发送请求注销
到这里,我们客户端启动主流程基本就完事了。咱们来梳理一下这个过程中主要都做了什么事
1、客户端启动类上使用@EnableEurekaClient注解
2、基于springboot自动装配bean原则找到EurekaClientAutoConfiguration
3、注入EurekaDiscoveryClientConfiguration中的marker以便注入EurekaClientAutoConfiguration
4、解析在客户端配置的配置文件并封装到bean中注入到容器
5、注入EurekaClient
- 获取注册列表
- 注册自己
- 初始化定时任务
- 心跳定时任务
- 缓存更新定时任务
6、注销客户端(关闭客户端时)