ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-06-28 17:32:36  阅读:148  来源: 互联网

标签:初始化 启动 eureka Client 注册表 Eureka server 源码


前言

本文讲解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的核心机制我们已经找到了入口,比如:

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

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

标签:初始化,启动,eureka,Client,注册表,Eureka,server,源码
来源: https://www.cnblogs.com/klhans/p/14945482.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有