Spring Cloud Alibaba 教程 | Nacos(二)


源碼解析客戶端注冊過程

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秒。
在這里插入圖片描述
在這里插入圖片描述

關注公眾號了解更多原創博文

![Alt](https://img-blog.csdnimg.cn/20191104123907694.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTA3Mzk1NTE=,size_16,color_FFFFFF,t_70#pic_center =591x339)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM