eureka server启动流程
EurekaBootStrap#contextInitialized(ServletContextEvent) 方法进行初始化
|
|
ConfigurationManager是一个double check+volatile实现的单例模式,并且其中所有的相关配置通过接口来实现。具体的实现类中,硬编码配置项名称,默认值等
初始化EurekaServerContext,包含大致7个步骤
|
|
1、加载eureka-server.properties的数据,初始化EurekaServerConfig
2、初始化ApplicationInfoManager及eurekaClient,其中用到的InstanceInfo使用了builder模式构造复杂的实例对象
(1)读取相关配置EurekaInstanceConfig和InstanceInfo
(2)根据配置,处理是否抓取注册表
(3)初始化3个线程池:调度线程池、心跳线程池、缓存刷新线程池
3、处理注册相关的事情
(1)创建PeerAwareInstanceRegistry内部比较重要的是MeasuredRate,其lastBucket统计上一分钟的心跳,currentBucket统计当前一分钟心跳。此组件用做eureka保护模式的重要判断依据
(2)构造peer节点同步组件,用以集群同步
(3)DefaultEurekaServerContext创建,并且启动服务注册,从相邻节点同步,注册监控统计项
![](eureka server启动的流程图.png)
再从eureka的example中例子
|
|
client启动流程
(1)读取eureka-client.properties配置文件,形成一个服务实例的配置,基于接口对外提供服务实例的配置项的读取
(2)基于服务实例的配置,构造了一个服务实例(InstanceInfo)
(3)基于服务实例的配置和服务实例,构造了一个服务实例管理器(ApplicationInfoManager)
(4)读取eureka-client.properites配置文件,形成一个eureka client的配置,接口接口对外提供eureka client的配置项的读取
(5)基于eureka client配置,和服务实例管理器,来构造了一个EurekaClient(DiscoveryClient),保存了一些配置,处理服务的注册和注册表的抓取,启动了几个线程池,启动了网络通信组件,启动了一些调度任务,注册了监控项
(6)DiscoveryClient内部依赖了一个InstanceInfoReplicator,进行服务注册 服务注册表实际上就是一个ConcurrentHashMap
|
|
服务端启动流程,仅仅增加服务端注册同步相关代码,其余与客户端启动一致
服务注册信息的获取接口ApplicationsResource#getContainers
其使用了多级缓存以提高并发性能
|
|
1、首先去readOnlyCacheMap中读,读到则返回。若没有则从readWriteCacheMap获取
2、readWriteCacheMap没有,则从注册表中去获取。定时比较readWriteCacheMap和readOnlyCacheMap,不一致时将最新的值更新到readOnlyCacheMap。
3、注册表在状态改变的时候,同步将对应的key从readWriteCacheMap清空。保证缓存最终一致性。此逻辑详见AbstractInstanceRegistry中的各方法对其调用
增量注册表
|
|
故障摘除
AbstractInstanceRegistry#evict(long additionalLeaseMs)
|
|
eureka集群注册表同步机制
PeerEurekaNode中的batchingDispatcher和nonBatchingDispatcher 负责调度
AcceptorExecutor负责从队列中拿出任务来执行
|
|
![](eureka server同步任务批处理机制.png)
spring-cloud-eureka-server注解式启动
@EnableEurekaServer注解,springboot启动以后,将eureka server启动起来。
EurekaServerAutoConfiguration使用spring boot的auto configuration机制,触发EurekaServerAutoConfiguration的执行。将eureka server需要的类,统统交由spring bean来进行注入
然后通过EurekaServerInitializerConfiguration来进行启动。
spring-cloud-eureka-client注解式启动
EurekaClientConfigBean配置文件读取配置
EurekaClientAutoConfiguration注入相关的类到spring容器中
EurekaAutoServiceRegistration重写了eureka client默认的注册逻辑,将原来InstanceInfoReplicator中的注册逻辑进行进一步的封装及定制。client启动以后就进行注册,不是eureka默认的40秒以后再注册。并且可以配置初始化注册状态
总结:@EnableEurekaClient,触发了一个EurekaClientAutoConfiguration类的执行,完成从application.yml中读取配置,完成DiscoveryClient的初始化和启动,通过自己额外加的一些代码,一启动,直接触发一次register()服务注册,向eureka server完成一次注册。