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
DiscoveryClient構造方法
eureka-client的構造方法中,體現了客戶端啟動的主要步驟,分為六大步:
-
從統一配置管理器中獲取配置,儲存到物件屬性中
-
如果這兩個引數為 false,代表eureka服務端以單機方式啟動,方法將提前返回
-
如果eurekaClient 以普通方式啟動: 初始化三個執行緒池
-
構造 client 與 server 網路通訊的元件,初始化相關通訊引數
-
服務發現: 拉取登錄檔核心邏輯,如果抓取失敗了,則從備份登錄檔中拉取
-
使用前面構造出來的執行緒池,執行定時排程任務,包括:
- 定時獲取增量登錄檔;
- 延時向server進行服務註冊
分析關鍵原始碼
上述的原始碼配合圖中的註釋能看個大概,可能有些現在看起來還雲裡霧裡,我們讀這種複雜元件的原始碼時,一定要學會抓大放小,即:
抓住核心功能和邏輯,忽略不重要的裝飾性功能。
否則遇到稍微複雜一點的原始碼,就會把自己看暈。
我們分析完eureka-server和eureka-client的核心入口之後,就會發現eureka的核心機制我們已經找到了入口,比如:
- 服務發現
- 服務註冊
- 服務續約等。
所以我們接下來的文章就會從這些功能入手,將我們還沒看懂的原始碼一點點都看懂。謝謝大家閱讀