从这篇我们开始分析springcloud 组件源码,相关组件有:eureka、ribbon、hystrix、feign、zuul、config、actuator等。今天分析eureka源码。
1、通过SPI 加载 spring.factories 如图:找到相关客户端jar包和相关实现类
2、重点看这里:点击 EurekaClientAutoConfiguration,
发现客户端配置的相关方法
这个是一个重要入口:
3、点击进入,看该类的父类 DiscoveryClient
5、点击进入:这是一个客户端最重要的类,做服务注册用。
启动eureka 客户端时直接进入这个方法
中间有三个核心点:
接着看下面一个方法:
6、服务续约保活 拉取:对应配置文件:
#是否从eureka中拉取注册信息
eureka.client.fetchRegistry=true
点击 shouldFetchRegistry()
继续往下看:对应配置注册和续约 ,然后心跳
#服务续约,心跳的时间间隔 eureka.instance.lease-renewal-interval-in-seconds=30
点击renew:如果没发现服务,则启动注册方法 register()
7、点击 register ,ctrl+t 选择进入,这个方法就会发送post 把客户端信息注册到eureka服务端。
端服务注册的地址
服务注册的节点信息
3、refreshRegistry 里面的 fetchRegistry 方法 全量拉取和增量拉取
4、从服务器获取服务列表后换成到 localRegionApps 中,后面 ribbon、feign、config、zuul 都用 到了这个 localRegionApps getApplications 方法调用,最终会走到这个类用 get 请求调用到 eureka 服务端
对应的请求地址:
5、服务注册和续约
6、6、先看看 register 方法,服务注册,最终会掉到该类: Post 请求到服务
7、在看看服务续约中的 sendHeartBeat 方法 Put 请求
请求信息,心跳只是把节点状态发送到了服务端
二、Eureka 服务端源码
1、先找jar
eureka 服务端是通过 JAX-RS 规范接收客户端的Http请求的
2、接收服务注册的方法
然后进入这个接收post的方法
核心方法保存到服务本地
3、接着看 register 方法 两件事,A、把客户端传递过来的节点信息报错到本地服务列表 B、把该 eureka 的信息复制到其他 eureka 节点上
这两件事不是原子操作,只能保证可用性和分区容错性!不能保证一致性
点击super.register 并且 ctrl+t ,进入后找到,保存客户端服务列表对应的服务端注册信息如下: Key 是对应的服务名称,value 则是这个服务对应的服务列表信息
复制 eureka 的节点信息到其他节点 ,点击 replicateToPeers
所有节点循环
接收续约心跳的方法
三 、服务拉取:对应配置文件:
1、#是否从eureka中拉取注册信息
eureka.client.fetchRegistry=true
点击 fetchRegistry 方法进入
两种拉取方式 :全量和增量
点击全量拉取
这个变量和rebbon 相关,记好:
2、get方法拉取列表
服务列表拉取已经完成!
到这里eureka源码分析完毕,从三个角度分析的:1、客户端服务注册 post 、2:服务端接收客户端注册请求并注册和复制、3:客户端服务列表拉取。当然还有服务列表清除、服务下线、自我保护等源码都包涵在这三个流程里。大家平日按照这个思路多看源码、多思考、多理解,很快就会熟练的。下篇我们分析ribbon 源码,敬请期待!