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,歡迎大家關注