源碼解析客戶端注冊過程
nacos作為注冊中心,包含了nacos服務端(注冊中心服務)和nacos客戶端,nacos注冊中心服務上面一講已經介紹過了它是一個用Java語言編寫開源web項目,並且擁有自己的管理台,對於nacos注冊中心服務我們后面文章會單獨抽出來講解,這篇文章我們先來源碼解析我們自己編寫的微服務項目(nacos客戶端)是如何被注冊到nacos注冊中心的。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
我們自己開發的微服務使用Nacos注冊中心時需要加入alibaba-nacos-discovery依賴,
spring-cloud-starter-alibaba-nacos-discovery直接依賴了spring-cloud-alibaba-nacos-discovery模塊。
spring-cloud-alibaba-nacos-discovery模塊使用了SpringBoot的starter機制(不了解的同學可以看這篇文章:https://www.cnblogs.com/lanqie/p/11172293.html)指定了自動配置類NacosDiscoveryAutoConfiguration
進入到NacosDiscoveryAutoConfiguration這個類,這是一個配置類,負責實例化三個對象NacosRegistration、NacosServiceRegistry、NacosAutoServiceRegistration。這三個對象是Spring Cloud Nacos Discovery 遵循了 spring cloud common 標准,分別對應實現了Registration 、ServiceRegistry、AutoServiceRegistration這三個接口。
NacosRegistration
NacosRegistration實現Registration接口和ServiceInstance接口,在nacos中它代表了一個服務實例,它描述了關於實例的id、名稱、ip、端口和元數據等等這些信息。
NacosServiceRegistry
NacosServiceRegistry則負責實現Spring Cloud標准接口ServiceRegistry的五個方法
- void register(R registration);
- void deregister(R registration);
- void close();
- void setStatus(R registration, String status);
-
T getStatus(R registration);
並且依賴了NamingService這個接口實例對象(NacosNamingService實現了該接口),NacosNamingService負責發起遠程HTTP(HTTPS)調用,並將實例信息發送到注冊中心服務,完成服務注冊,稍后會詳細分析。
NacosAutoServiceRegistration
NacosAutoServiceRegistration繼承了抽象類AbstractAutoServiceRegistration,AbstractAutoServiceRegistration實現了標准接口AutoServiceRegistration(該接口是一個空接口),並且實現了ApplicationListener應用監聽接口去監聽WebServerInitializedEvent事件,WebServerInitializedEvent事件代表了應用初始化完成。同時NacosAutoServiceRegistration對象還依賴了NacosRegistration和ServiceRegistry這兩個對象。
所以當應用啟動並且初始化完成之后,會回調onApplicationEvent方法,緊接着進入到bind方法里面,然后調用了start()方法,在start()方法里面調用了register方法。
最終通過依賴的serviceRegistry對象調用它的標准方法register(),注冊Registration實例。
NacosNamingService
進入到NacosServiceRegistry的register方法,獲取到serviceId和instance之后,調用namingService的registerInstance(String serviceName, Instance instance)方法。
接着進入到NacosNamingService類的registerInstance方法,在通過serverProxy發起實例注冊之前,實例化了BeatInfo對象,並且通過BeatReactor先發送心跳數據到注冊中心。
進入到NamingProxy的registerService()方法,在該方法里面構造HTTP(HTTPS)的請求參數,其中請求方式是HttpMethod.POST,UtilAndComs.NACOS_URL_INSTANCE值為目標地址注冊中心對應處理注冊的Controller的URL路徑,值為:/nacos/v1/ns/instance。
BeatReactor
BeatReactor負責實例和注冊中心的心跳維持,構造方法依賴了NamingProxy發起遠程HTTP(HTTPS)調用,通過threadCount創建ScheduledExecutorService任務線程池服務類。實例注冊的時候調用了addBeatInfo()方法,通過ScheduledExecutorService執行BeatTask任務
BeatTask任務通過serverProxy發送心跳信息給注冊中心,之后立馬通過executorService在period間隔時長之后再次執行BeatTask任務,如此循環達到和注冊中心服務維持心跳的作用。
默認心跳間隔時長是5秒。