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