原始碼分析 SpringCloud 2020.0.4 版本 EurekaClient 的註冊過程

追風人聊Java發表於2021-12-29

1. 概述

老話說的好:要善於思考,有創新意識。

 

言歸正傳,之前聊了 Springboot 的啟動過程,今天來聊聊 Eureka Client 的註冊過程。

 

2. Eureka Client 的註冊過程

2.1 找入口

 Eureka Client 留給我們的線索不多,似乎只有這個 @EnableDiscoveryClient 註解,我們進去看看

 

 看到了一個 @Import 註解,進入到 EnableDiscoveryClientImportSelector 類看看

 

 從邏輯看,後面會例項化 AutoServiceRegistrationConfiguration 這個類,進去這個類看看

 

 有點高深。。。,似乎只有 AutoServiceRegistrationProperties 這個類有點用,翻譯過來是 自動服務註冊屬性,應該和註冊有關,來看看哪裡呼叫它了吧。

 

 進入 AbstractAutoServiceRegistration 類

 

例項化的時候用到了,跟它一起注入的有個 ServiceRegistry 物件,似乎這個物件和服務註冊關係更大

 

 這 ServiceRegistry 是個介面,裡面有 register 方法,進入子類方法看看

 

 好在只有一個子類 EurekaServiceRegistry,設定個斷點,我們驗證一下

 

2.2 EurekaServiceRegistry

 斷點果然到這裡了,但從邏輯看,似乎並沒有請求 Eureka Server 的程式碼出現。

 

 我們把斷點的方法棧往上跳一層,會看到下一步是向上下文中釋出一個 InstanceRegisteredEvent 事件,看來之後某個監聽器會呼叫這個事件

 

2.3 再次尋找線索

釋出事件後,似乎斷線了,我們到 jar 包裡看看。(從監聽器找線索也可以)

 看到了 EurekaDiscoveryClient 這個類,根據經驗應該是由這個類請求 Eureka Server 吧

 

 似乎類裡也沒有請求 Eureka Server 的邏輯,但裡面注入了一個 EurekaClient

 

 開啟 EurekaClient,是個介面,上面有一行 @ImplementedBy 註解,引數是 DiscoveryClient.class,進去看看

 

 裡面有個 register(註冊)方法,設定個斷點,試試

 

2.4 各種裝飾

 果然走到了,但似乎又去調了 SessionedEurekaHttpClient 的 register 方法

 

 來到 SessionedEurekaHttpClient 類,我們發現 register 在它的父類 EurekaHttpClientDecorator 中,從名稱就能看出這是個裝飾器模式

 

父類的 register 方法,呼叫子類的 execute 方法,引數是一個匿名內部類,匿名內部類中實現的 execute 方法,引數是一個 EurekaHttpClient 的子類,然後再呼叫這個類的 register 方法

 

 進入到 SessionedEurekaHttpClient 類的 excute 方法,果然加了裝飾

 

相同的包下,有 RetryableEurekaHttpClient、RedirectingEurekaHttpClient、MetricsCollectingEurekaHttpClient、SessionedEurekaHttpClient 4個裝飾器類。

 

然後跟斷點,發現是一系列的裝飾。。。

 

2.5 真正註冊

經過一系列的裝飾,終於找到了 RestTemplateEurekaHttpClient 這個非裝飾類

這個方法裡要真正的發起請求了,urlPath 都有了

urlPath:http://localhost:35000/eureka/apps/MY-EUREKA-CLIENT,應該就是這裡了

 

 

 

 最終,使用 httpClient 完成了請求的呼叫

 

2.6 總結

整個流程中用到了類的自動裝載,上下文事件,裝飾器模式,反射等知識,多看看確實能學到不少平時不常用的技術。

 

3. 綜述

今天聊了一下 EurekaClient 的註冊過程,希望可以對大家的工作有所幫助

歡迎幫忙點贊、評論、轉發、加關注 :)

關注追風人聊Java,每天更新Java乾貨。

 

4. 個人公眾號

追風人聊Java,歡迎大家關注

相關文章