基于之前分析的eureka为什么保证ZP和zookeeper为什么保证CP的理解上,本文在分析eureka server端启动源码上去尝试去理清启动流程都做了那些事。
1、基于自动装配的eureka配置类(EurekaServerAutoConfiguration)
spring boot 自动装配原理就不多说了直接搜spring.factoris文件,找到spring-cloud-netflix-eureka-server 包中
进入该类首先看到的依然是不可缺少的@import,@ConditionalOnBean
2、启动事件下发
先看@import导入的EurekaServerInitializerConfiguration干了什么
重写了一个父类的start方法,主要作用是启动一个线程去下发各种事件,并且将running设置为true。可以理解为启动事件的下发。
再看@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class)
只是判断容器中是否存在EurekaServerMarkerConfiguration.Marker,这个marker字面意思是一个标记,这个标记是与eureka server启动类上相呼应
在启动类上的@EnableEurekaServer注解中有@Import(EurekaServerMarkerConfiguration.class),所以如果启动类加@EnableEurekaServer 则会将Marker初始化,在这里的时候则需要加载eureka server配置类。
3、初始化dashboard
在往下看@ConditionalOnProperty判断配置是否生效,这里判断eureka.dashboard 是否开启,默认开启。
4、初始化集群注册列表和集群节点对象
peerAwareInstanceRegistry主要用来初始化集群列表对象,peerEurekaNodes用来初始化集群节点对象,对象的初始化不做过多赘述。
5、初始化eurekaServer上下文对象(更新缓存信息)
这里初始化DefaultEurekaServerContext对象,该对象有一个被@PostConstruct声明的initialize方法。
该方法主要做两件事,peerEurekaNodes.start启动更新其他节点信息任务,
registry.init会初始化二级缓存,启动续约定时任务,初始化region的注册。
eureka server二级缓存是eureka AP的一部分设计,避免多个服务进行注册和更新的时候产生并发问题,而eureka为了保证AP使用只读缓存和读写缓存来进行隔离,两个缓存之间通过任务去更新保证最终一致性即可。
6、初始化启动类EurekaServerBootstrap(同步节点信息,更新续约和服务剔除)
public void contextInitialized(ServletContext context) {
try {
initEurekaEnvironment();
initEurekaServerContext();
context.setAttribute(EurekaServerContext.class.getName(), this.serverContext);
}
catch (Throwable e) {
log.error("Cannot bootstrap eureka server :", e);
throw new RuntimeException("Cannot bootstrap eureka server :", e);
}
}
EurekaServerBootstrap主要做两件事
initEurekaEnvironment 初始化运行环境
initEurekaServerContext 初始化上下文信息
initEurekaEnvironment初始化运行环境 这里只看到打了一行日志。。。
protected void initEurekaEnvironment() throws Exception {
log.info("Setting the eureka configuration..");
}
initEurekaServerContext则会做两件事
registry.syncUp 获取集群中其他节点信息进行同步
registry.openForTraffic 会更新续约,如果有不可用的服务则会进行剔除。
7.eureka 注册
这里承接下上面说到的服务注册,具体流程
后面就是往队列添加注册实例和更新缓存的操作,
7、eureka 注册
这里承接下上面说到的服务注册,具体流程
后面就是往队列添加注册实例和更新缓存的操作,
注册流程使用读锁来阻塞写操作,先从currentHashmap中根据appName获取一个map,然后再根据服务id从map中获取,并且与当前服务的dirtyTime进行对比,哪一个最新则使用那个,就算一样也是用远程的。
8、续约
续约流程跟注册差不多,只不过最后更新续约时间。
以上就是eureka server 启动的大致流程,根据启动相关源码的梳理我画了一个大概流程图,具体如下。
关注我的公众号 LearnMoreDoMore 可以及时看到更多技术分享文章