从这篇我们开始分析springcloud 组件源码,相关组件有:eureka、ribbon、hystrix、feign、zuul、config、actuator等。今天分析eureka源码。

1、通过SPI 加载 spring.factories 如图:找到相关客户端jar包和相关实现类

springcloudalibaba开源项目地址_服务列表

 

springcloudalibaba开源项目地址_spring boot_02

springcloudalibaba开源项目地址_客户端_03

 

2、重点看这里:点击  EurekaClientAutoConfiguration,

springcloudalibaba开源项目地址_服务列表_04

发现客户端配置的相关方法 

springcloudalibaba开源项目地址_spring boot_05

 这个是一个重要入口:

springcloudalibaba开源项目地址_客户端_06

看该类的父类 DiscoveryClient

springcloudalibaba开源项目地址_spring boot_07

 

 5、点击进入:这是一个客户端最重要的类,做服务注册用。

springcloudalibaba开源项目地址_服务端_08

启动eureka 客户端时直接进入这个方法

springcloudalibaba开源项目地址_服务列表_09

 中间有三个核心点:

springcloudalibaba开源项目地址_spring boot_10

 

 

 

接着看下面一个方法: 

springcloudalibaba开源项目地址_spring boot_11

6、服务续约保活 拉取:对应配置文件:

#是否从eureka中拉取注册信息

eureka.client.fetchRegistry=true

springcloudalibaba开源项目地址_spring boot_12

点击  shouldFetchRegistry()

springcloudalibaba开源项目地址_spring boot_13

 

springcloudalibaba开源项目地址_服务列表_14

springcloudalibaba开源项目地址_服务列表_15

 继续往下看:对应配置注册和续约  ,然后心跳

#服务续约,心跳的时间间隔eureka.instance.lease-renewal-interval-in-seconds=30


springcloudalibaba开源项目地址_客户端_16

 

springcloudalibaba开源项目地址_spring boot_17

点击renew:如果没发现服务,则启动注册方法 register()

 

springcloudalibaba开源项目地址_spring boot_18

springcloudalibaba开源项目地址_服务列表_19

 7、点击 register  ,ctrl+t  选择进入,这个方法就会发送post  把客户端信息注册到eureka服务端。

springcloudalibaba开源项目地址_spring boot_20

端服务注册的地址

springcloudalibaba开源项目地址_spring boot_21

服务注册的节点信息

springcloudalibaba开源项目地址_客户端_22

 

springcloudalibaba开源项目地址_客户端_23

 

3、refreshRegistry 里面的 fetchRegistry 方法 
全量拉取和增量拉取

springcloudalibaba开源项目地址_spring boot_24

springcloudalibaba开源项目地址_spring boot_25

4、从服务器获取服务列表后换成到 localRegionApps 中,后面 ribbon、feign、config、zuul 都用 
到了这个 localRegionApps 
getApplications 方法调用,最终会走到这个类用 get 请求调用到 eureka 服务端 

springcloudalibaba开源项目地址_服务端_26

对应的请求地址:

springcloudalibaba开源项目地址_客户端_27

5、服务注册和续约

springcloudalibaba开源项目地址_客户端_28

springcloudalibaba开源项目地址_服务列表_29

springcloudalibaba开源项目地址_服务列表_30

6、6、先看看 register 方法,服务注册,最终会掉到该类: 
Post 请求到服务

springcloudalibaba开源项目地址_spring boot_31

7、在看看服务续约中的 sendHeartBeat 方法 
Put 请求

springcloudalibaba开源项目地址_服务端_32

请求信息,心跳只是把节点状态发送到了服务端

springcloudalibaba开源项目地址_客户端_33

 

二、Eureka 服务端源码 

1、先找jar 

springcloudalibaba开源项目地址_服务端_34

springcloudalibaba开源项目地址_spring boot_35

eureka 服务端是通过 JAX-RS 规范接收客户端的Http请求的

 

springcloudalibaba开源项目地址_spring boot_36

 

springcloudalibaba开源项目地址_服务列表_37

 

2、接收服务注册的方法

springcloudalibaba开源项目地址_服务列表_38

然后进入这个接收post的方法 

springcloudalibaba开源项目地址_客户端_39

核心方法保存到服务本地 

springcloudalibaba开源项目地址_spring boot_40

3、接着看 register 方法 
两件事,A、把客户端传递过来的节点信息报错到本地服务列表 
               B、把该 eureka 的信息复制到其他 eureka 节点上 

这两件事不是原子操作,只能保证可用性和分区容错性!不能保证一致性

springcloudalibaba开源项目地址_服务列表_41


点击super.register 并且 ctrl+t ,进入后找到,保存客户端服务列表


springcloudalibaba开源项目地址_客户端_42

对应的服务端注册信息如下: 
Key 是对应的服务名称,value 则是这个服务对应的服务列表信息

springcloudalibaba开源项目地址_客户端_43

复制 eureka 的节点信息到其他节点  ,点击 

所有节点循环

springcloudalibaba开源项目地址_服务列表_44

 

springcloudalibaba开源项目地址_服务端_45

接收续约心跳的方法

springcloudalibaba开源项目地址_客户端_46

springcloudalibaba开源项目地址_服务列表_47

三  、服务拉取:对应配置文件:

 

1、#是否从eureka中拉取注册信息

eureka.client.fetchRegistry=true

springcloudalibaba开源项目地址_服务端_48

springcloudalibaba开源项目地址_spring boot_49

springcloudalibaba开源项目地址_服务端_50

springcloudalibaba开源项目地址_spring boot_51

springcloudalibaba开源项目地址_服务端_52

 点击  fetchRegistry  方法进入

springcloudalibaba开源项目地址_服务列表_53

 两种拉取方式  :全量和增量

springcloudalibaba开源项目地址_spring boot_54

点击全量拉取

springcloudalibaba开源项目地址_服务端_55

这个变量和rebbon  相关,记好:

springcloudalibaba开源项目地址_spring boot_56

2、get方法拉取列表 

springcloudalibaba开源项目地址_客户端_57

 

springcloudalibaba开源项目地址_服务端_58

服务列表拉取已经完成!

到这里eureka源码分析完毕,从三个角度分析的:1、客户端服务注册 post  、2:服务端接收客户端注册请求并注册和复制、3:客户端服务列表拉取。当然还有服务列表清除、服务下线、自我保护等源码都包涵在这三个流程里。大家平日按照这个思路多看源码、多思考、多理解,很快就会熟练的。下篇我们分析ribbon 源码,敬请期待!