Eureka源码系列 —— 3.EurekaServer和Client的启动流程

前言

本文讲解eureka-server的启动源码。

Server启动

《Eureka源码系列 —— 2.源码启动入口》文章中我们提到过EurekaBootStrap实现了ServletContextListener接口,web容器启动的时候,会调用javax.servlet.ServletContextListener#contextInitialized方法,将实现类的逻辑拉起来,这个方法就是eureka-server的启动入口,该方法如下图:

image-20210623172100325

分为三步:

  1. 初始化datacenter和环境,将这两个配置放入ConfigurationManager中,

    ConfigurationManager是eureka使用的统一管理配置的工具

  2. 初始化eureka-server上下文,主要逻辑在这里

  3. 将初始化好的 eureka-server上下文 放入servletContext中

重点在第二步的方法中,我们直接去看这个方法。

initEurekaServerContext方法

image-20210623174536447

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构造方法

image-20210623200648812

eureka-client的构造方法中,体现了客户端启动的主要步骤,分为六大步:

  1. 从统一配置管理器中获取配置,保存到对象属性中

  2. 如果这两个参数为 false,代表eureka服务端以单机方式启动,方法将提前返回

  3. 如果eurekaClient 以普通方式启动: 初始化三个线程池

  4. 构造 client 与 server 网络通信的组件,初始化相关通信参数

  5. 服务发现: 拉取注册表核心逻辑,如果抓取失败了,则从备份注册表中拉取

  6. 使用前面构造出来的线程池,执行定时调度任务,包括:

    1. 定时获取增量注册表;
    2. 延时向server进行服务注册

分析关键源码

上述的源码配合图中的注释能看个大概,可能有些现在看起来还云里雾里,我们读这种复杂组件的源码时,一定要学会抓大放小,即:

抓住核心功能和逻辑,忽略不重要的装饰性功能

否则遇到稍微复杂一点的源码,就会把自己看晕。

我们分析完eureka-server和eureka-client的核心入口之后,就会发现eureka的核心机制我们已经找到了入口,比如:

  • 服务发现
  • 服务注册
  • 服务续约等。

所以我们接下来的文章就会从这些功能入手,将我们还没看懂的源码一点点都看懂。谢谢大家阅读

posted @ 2021-06-28 17:28  孔令翰  阅读(241)  评论(0编辑  收藏  举报