Spring Cloud Eureka Server源码分析

总览

昨天文章分析介绍可Eureka Client的流程,今天接着昨天的将分析Eureka  Server的一个流程。EurekaServer 是服务的注册中心,负责Eureka Client的相关信息注册,主要职责:

  • 服务注册
  • 接受心跳服务
  • 服务剔除
  • 服务下线
  • 集群同步

@EnableEurekaServer

通过向Spring容器注入EurekaServerMarkerConfiguration#Maker的形式**EurekaServerAutoConfiguration 配置类

Spring Cloud Eureka Server源码分析

 

自动装配的主入口

EurekaServerAutoConfiguration 是通过配置文件自动进行装配的,只要上面开启EnableEurekaServer这个注解

Spring Cloud Eureka Server源码分析

Spring Cloud Eureka Server源码分析

Spring Cloud Eureka Server源码分析

EurekaServerAutoConfiguration向Spring注入了InstanceRegistry,后面的服务注册是InstanceRegistry的方法

Spring Cloud Eureka Server源码分析

 

注册 Jersey filter: 所有/eureka的请求都需要经过Jersery Filter,其处理类是com.sun.jersey.spi.container.servlet.ServletContainer,其既是Filter,也是Servlet,包含Jersey的处理逻辑。在构造时已经将com.netflix.discovery包 和 com.netflix.eureka包 下的类作为处理请求的资源导入,如处理单个应用请求的com.netflix.eureka.resources.ApplicationResource

Spring Cloud Eureka Server源码分析

 

ApplicationResource

 

ApplicationResource通过addInstance注册单个应用实例,最终调用的是PeerAwareInstanceRegistry的一个实现类InstanceRegistry的register方法进行注册的

Spring Cloud Eureka Server源码分析

Spring Cloud Eureka Server源码分析

代码结构

为什么是InstanceRegistry的register方法呢,我们通过下面的图看下继承结构

Spring Cloud Eureka Server源码分析

 

首先看下最上层的接口LeaseManager有哪些方法以及作用,看源码可以先看看doc文档说些啥,看不懂没关系,猜就对了。

 

  • This class is responsible for creating/renewing and evicting a lease for a particular instance.
  • Leases determine what instances receive traffic. When there is no renewal request from the client, the lease gets expired and the instances are evicted out of AbstractInstanceRegistry. This is key to instances receiving traffic or not.

Spring Cloud Eureka Server源码分析

AbstractInstanceRegistry

  • Handles all registry requests from eureka clients.
  • Primary operations that are performed are the Registers, Renewals, Cancels, Expirations, and Status Changes. The registry also stores only the delta operations

 

 

服务注册

上面提到服务是InstanceRegistry的register方法进行注册的,但是InstanceRegistry最终调用的是父类的方法, 服务注册最终是通过AbstractInstanceRegistry类的register进行注册的,服务注册其实就是放到一个ConcurrentHashMap里面去,如下:

Spring Cloud Eureka Server源码分析

Spring Cloud Eureka Server源码分析

然后是租约信息,根据instanceId获取实例的租约,如果该实例的租约已经存在,比较最后的更新时间戳大小,取最大值的注册信息信息

Spring Cloud Eureka Server源码分析

如果租约不存在,注册一个新的实例,保存租约到map中

Spring Cloud Eureka Server源码分析

 更多文章请关注我的公众号

Spring Cloud Eureka Server源码分析