前言
本文讲解eureka-server的启动源码。
Server启动
《02、Eureka源码系列-源码启动入口》文章中我们提到过EurekaBootStrap实现了ServletContextListener接口,web容器启动的时候,会调用javax.servlet.ServletContextListener#contextInitialized方法,将实现类的逻辑拉起来,这个方法就是eureka-server的启动入口,该方法如下图:
分为三步:
1、 初始化datacenter和环境,将这两个配置放入ConfigurationManager中,;
ConfigurationManager是eureka使用的统一管理配置的工具
2、 初始化eureka-server上下文,主要逻辑在这里;
3、 将初始化好的eureka-server上下文放入servletContext中;
重点在第二步的方法中,我们直接去看这个方法。
initEurekaServerContext方法
initEurekaServerContext基本包含了eureka-server启动的所有步骤,主要分为六大步:
1、 读取eureka-server.properties
配置,将配置都放入一个统一的工具类中;
2、 构造三个对象,这三个对象各司其职;
1、 构造eurekaServer内部的eurekaClient对象,用来跟其他server节点互相注册和通信;
2、 构造能感知集群的服务实例注册表,用来处理实例注册和向集群内其他节点同步注册信息;
3、 构造peerEurekaNodes,这是一个用来管理集群内节点的工具类,命名风格形似java.util.Collections;
3、 基于上文中构造出来的对象,构造了eureka-server上下文对象;
4、 执行构造出来的eureka-server上下文的initialize方法,进行初始化;
5、 从邻近的eureka节点中拷贝注册表,如果失败,找下一个;
6、 定时剔除没有发送心跳的失效服务;
Client启动
上文中我们讲到,server启动过程中有一部会创建eureka-client对象,其实这一步就是client的启动入口。在我们平常开发中,springboot也会通过自动装配,帮我们执行DiscoveryClient
的构造方法,将我们的应用服务注册为eureka客户端。所以我们直接来看DiscoveryClient的构造方法。
DiscoveryClient构造方法
eureka-client的构造方法中,体现了客户端启动的主要步骤,分为六大步:
1、 从统一配置管理器中获取配置,保存到对象属性中;
2、 如果这两个参数为false,代表eureka服务端以单机方式启动,方法将提前返回;
3、 如果eurekaClient以普通方式启动:初始化三个线程池;
4、 构造client与server网络通信的组件,初始化相关通信参数;
5、 服务发现:拉取注册表核心逻辑,如果抓取失败了,则从备份注册表中拉取;
6、 使用前面构造出来的线程池,执行定时调度任务,包括:;
1、 定时获取增量注册表;;
2、 延时向server进行服务注册;
分析关键源码
上述的源码配合图中的注释能看个大概,可能有些现在看起来还云里雾里,我们读这种复杂组件的源码时,一定要学会抓大放小,即:
抓住核心功能和逻辑,忽略不重要的装饰性功能。
否则遇到稍微复杂一点的源码,就会把自己看晕。
我们分析完eureka-server和eureka-client的核心入口之后,就会发现eureka的核心机制我们已经找到了入口,比如:
- 服务发现
- 服务注册
- 服务续约等。
所以我们接下来的文章就会从这些功能入手,将我们还没看懂的源码一点点都看懂。谢谢大家阅读