1. 程式人生 > 其它 >Eureka原始碼系列 —— 3.EurekaServer和Client的啟動流程

Eureka原始碼系列 —— 3.EurekaServer和Client的啟動流程

前言

本文講解eureka-server的啟動原始碼。

Server啟動

《Eureka原始碼系列 —— 2.原始碼啟動入口》文章中我們提到過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的核心機制我們已經找到了入口,比如:

  • 服務發現
  • 服務註冊
  • 服務續約等。

所以我們接下來的文章就會從這些功能入手,將我們還沒看懂的原始碼一點點都看懂。謝謝大家閱讀