总览
昨天文章分析介绍可Eureka Client的流程,今天接着昨天的将分析Eureka Server的一个流程。EurekaServer 是服务的注册中心,负责Eureka Client的相关信息注册,主要职责:
- 服务注册
- 接受心跳服务
- 服务剔除
- 服务下线
- 集群同步
@EnableEurekaServer
通过向Spring容器注入EurekaServerMarkerConfiguration#Maker的形式激活EurekaServerAutoConfiguration 配置类
自动装配的主入口
EurekaServerAutoConfiguration 是通过配置文件自动进行装配的,只要上面开启EnableEurekaServer这个注解
EurekaServerAutoConfiguration向Spring注入了InstanceRegistry,后面的服务注册是InstanceRegistry的方法
注册 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
ApplicationResource
ApplicationResource通过addInstance注册单个应用实例,最终调用的是PeerAwareInstanceRegistry的一个实现类InstanceRegistry的register方法进行注册的
代码结构
为什么是InstanceRegistry的register方法呢,我们通过下面的图看下继承结构
首先看下最上层的接口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.
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里面去,如下:
然后是租约信息,根据instanceId获取实例的租约,如果该实例的租约已经存在,比较最后的更新时间戳大小,取最大值的注册信息信息
如果租约不存在,注册一个新的实例,保存租约到map中
更多文章请关注我的公众号