日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
SpringCloud集成Nacos服務(wù)發(fā)現(xiàn)源碼解析?翻了三套源碼,保質(zhì)保鮮!

本文轉(zhuǎn)載自微信公眾號「程序新視界」,作者丑胖俠二師兄。轉(zhuǎn)載本文請聯(lián)系程序新視界公眾號。

蓮池ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!

前言

前面文章我們介紹了Nacos的功能及設(shè)計架構(gòu),這篇文章就以Nacos提供的服務(wù)注冊功能為主線,來講解Nacos的客戶端是如何在Spring Cloud進(jìn)行集成和實現(xiàn)的。

本會配合源碼分析、流程圖整理、核心API解析等維度來讓大家深入淺出、系統(tǒng)的來學(xué)習(xí)。

Spring Boot的自動注冊

故事要從頭Spring Boot的自動注入開始。很多朋友大概都了解過Spring Boot的自動配置功能,而Spring Cloud又是基于Spring Boot框架的。

因此,在學(xué)習(xí)Nacos注冊業(yè)務(wù)之前,我們先來回顧一下Spring Boot的自動配置原理,這也是學(xué)習(xí)的入口。

Spring Boot通過@EnableAutoConfiguration注解,將所有符合條件的@Configuration配置都加載到當(dāng)前SpringBoot創(chuàng)建并使用的IoC容器。

上述過程是通過@Import(AutoConfigurationImportSelector.class)導(dǎo)入的配置功能,AutoConfigurationImportSelector中的方法getCandidateConfigurations,得到待配置的class的類名集合,即所有需要進(jìn)行自動配置的(xxxAutoConfiguration)類,這些類配置于META-INF/spring.factories文件中。

最后,根據(jù)這些全限定名類上的注解,如:OnClassCondition、OnBeanCondition、OnWebApplicationCondition條件化的決定要不要自動配置。

了解了Spring Boot的基本配置之后,我們來看看Nacos對應(yīng)的自動配置在哪里。

Spring Cloud中的Nacos自動配置

查看Spring Cloud的項目依賴,本人引入依賴對應(yīng)的jar包為spring-cloud-starter-alibaba-nacos-discovery-2021.1.jar;

對應(yīng)的pom依賴為:

 
 
 
 
  1.     com.alibaba.cloud
  2.     spring-cloud-starter-alibaba-nacos-discovery

查看jar包中META-INF/spring.factories文件的內(nèi)容:

 
 
 
 
  1. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  2.   com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
  3.   com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\
  4.   com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\
  5.   com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
  6.   com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\
  7.   com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\
  8.   com.alibaba.cloud.nacos.NacosServiceAutoConfiguration
  9. org.springframework.cloud.bootstrap.BootstrapConfiguration=\
  10.   com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration

可以看到EnableAutoConfiguration類對應(yīng)了一系列的Nacos自動配置類。

其中NacosServiceRegistryAutoConfiguration是用來封裝實例化Nacos注冊流程所需組件的,裝載了對三個對象NacosServiceRegistry、NacosRegistration、NacosAutoServiceRegistration,這三個對象整體都是為了Nacos服務(wù)注冊使用的。

 
 
 
 
  1. @Configuration(proxyBeanMethods = false)
  2. @EnableConfigurationProperties
  3. @ConditionalOnNacosDiscoveryEnabled
  4. @ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
  5.         matchIfMissing = true)
  6. @AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class,
  7.         AutoServiceRegistrationAutoConfiguration.class,
  8.         NacosDiscoveryAutoConfiguration.class })
  9. public class NacosServiceRegistryAutoConfiguration {
  10.     @Bean
  11.     public NacosServiceRegistry nacosServiceRegistry(
  12.             NacosDiscoveryProperties nacosDiscoveryProperties) {
  13.         return new NacosServiceRegistry(nacosDiscoveryProperties);
  14.     }
  15.     @Bean
  16.     @ConditionalOnBean(AutoServiceRegistrationProperties.class)
  17.     public NacosRegistration nacosRegistration(
  18.             ObjectProvider> registrationCustomizers,
  19.             NacosDiscoveryProperties nacosDiscoveryProperties,
  20.             ApplicationContext context) {
  21.         return new NacosRegistration(registrationCustomizers.getIfAvailable(),
  22.                 nacosDiscoveryProperties, context);
  23.     }
  24.     @Bean
  25.     @ConditionalOnBean(AutoServiceRegistrationProperties.class)
  26.     public NacosAutoServiceRegistration nacosAutoServiceRegistration(
  27.             NacosServiceRegistry registry,
  28.             AutoServiceRegistrationProperties autoServiceRegistrationProperties,
  29.             NacosRegistration registration) {
  30.         return new NacosAutoServiceRegistration(registry,
  31.                 autoServiceRegistrationProperties, registration);
  32.     }
  33. }

其中NacosServiceRegistry封裝的就是注冊流程,它繼承自ServiceRegistry:

 
 
 
 
  1. public class NacosServiceRegistry implements ServiceRegistry {...}

查看該類源碼,可以看到該類中實現(xiàn)了服務(wù)注冊、注銷、關(guān)閉、設(shè)置狀態(tài)、獲取狀態(tài)5個功能。

我們要追蹤的服務(wù)注冊功能,便是通過它提供的register方法來實現(xiàn)的。

至此,我們可以梳理一下Nacos客戶端在Spring Cloud中集成并實例化的處理流程。

Spring Cloud的ServiceRegistry接口

上面提到NacosServiceRegistry集成自ServiceRegistry,那么ServiceRegistry又是何方神圣呢?

ServiceRegistry接口是Spring Cloud的類,來看一下ServiceRegistry接口的定義:

 
 
 
 
  1. public interface ServiceRegistry {
  2.     void register(R registration);
  3.     void deregister(R registration);
  4.     void close();
  5.     void setStatus(R registration, String status);
  6.      T getStatus(R registration);
  7. }

可以看出ServiceRegistry接口中定義了服務(wù)注冊、注銷、關(guān)閉、設(shè)置狀態(tài)、獲取狀態(tài)五個接口。

如果看其他服務(wù)發(fā)現(xiàn)框架對Spring Cloud進(jìn)行集成時,基本上都是實現(xiàn)的這個接口。也就是說,ServiceRegistry是Spring Cloud提供的一個服務(wù)發(fā)現(xiàn)框架集成的規(guī)范。對應(yīng)的框架安裝規(guī)范實現(xiàn)對應(yīng)的功能即可進(jìn)行集成。

我們可以看到Eureka、Zookeeper、Consul在Spring Cloud中集成也都是實現(xiàn)了該接口,同時,如果你需要自定義服務(wù)發(fā)現(xiàn)功能,也可以通過實現(xiàn)該接口來達(dá)到目的。

NacosServiceRegistry服務(wù)注冊實現(xiàn)

暫且不關(guān)注其他的輔助類,直接來看NacosServiceRegistry#register方法,它提供了服務(wù)注冊的核心業(yè)務(wù)邏輯實現(xiàn)。

我們把該類的輔助判斷去掉,直接展示最核心的代碼如下:

 
 
 
 
  1. @Override
  2. public void register(Registration registration) {
  3.     // 獲取NamingService
  4.     NamingService namingService = namingService();
  5.     String serviceId = registration.getServiceId();
  6.     String group = nacosDiscoveryProperties.getGroup();
  7.     // 構(gòu)造實例,封裝信息來源于配置屬性
  8.     Instance instance = getNacosInstanceFromRegistration(registration);
  9.     // 將實例進(jìn)行注冊
  10.     namingService.registerInstance(serviceId, group, instance);
  11. }

上述代碼中NamingService已經(jīng)屬于Nacos Client項目提供的API支持了。

關(guān)于Nacos Client的API流程查看,可直接查看Nacos對應(yīng)的源碼,NamingService#registerInstance方法對應(yīng)的流程圖整理如下:

上述流程圖還可以繼續(xù)細(xì)化,這個我們在后續(xù)章節(jié)中進(jìn)行專門講解,這里大家知道大概的調(diào)用流程即可。

Spring Cloud服務(wù)注冊鏈路

下面我們來梳理一下Spring Cloud是如何進(jìn)行服務(wù)注冊的,其中流程的前三分之二部分幾乎所有的服務(wù)注冊框架都是一樣的流程,只有最后一部分進(jìn)行實例注冊時會調(diào)用具體的框架來進(jìn)行實現(xiàn)。

直接來看整個調(diào)用的鏈路圖:

圖中不同的顏色代表這不同的框架,灰色表示業(yè)務(wù)代碼,淺綠色表示SpringBoot框架,深綠色表示Spring框架,淺橙色表示SpringCloud框架,其中這一部分也包含了依賴的Nacos組件部分,最后淺紫色代表著Nacos Client的包。

核心流程分以下幾步:

第一步,SpringBoot在啟動main方法時調(diào)用到Spring的核心方法refresh;

第二步,在Spring中實例化了WebServerStartStopLifecycle對象。

重點說一下WebServerStartStopLifecycle對象,它的start方法被調(diào)用時會發(fā)布一個ServletWebServerInitializedEvent事件類,這個事件類繼承自WebServerInitializedEvent。后面用來處理服務(wù)注冊的類AbstractAutoServiceRegistration同時也是一個監(jiān)聽器,專門用來監(jiān)聽WebServerInitializedEvent事件。

第三步,AbstractApplicationContext的finishRefresh中會間接調(diào)用DefaultLifecycleProcessor的startBeans方法,進(jìn)而調(diào)用了WebServerStartStopLifecycle的start方法。就像上面說的,觸發(fā)了ServletWebServerInitializedEvent事件的發(fā)布。

第四步,AbstractAutoServiceRegistration監(jiān)聽到對應(yīng)的事件,然后基于Spring Cloud定義的ServiceRegistry接口進(jìn)行服務(wù)注冊。

上面的描述省略了一些部分細(xì)節(jié),但整個流程基本上就是SpringBoot在啟動時發(fā)布了一個事件,Spring Cloud監(jiān)聽到對應(yīng)的事件,然后進(jìn)行服務(wù)的注冊。

小結(jié)

為了這篇文章,肝了好幾天。Spring Cloud源碼、Spring Boot源碼、Nacos源碼都翻了個遍。最終為大家分享了Nacos或者說是Spring Cloud中服務(wù)發(fā)現(xiàn)的實現(xiàn)機制及流程。


網(wǎng)頁標(biāo)題:SpringCloud集成Nacos服務(wù)發(fā)現(xiàn)源碼解析?翻了三套源碼,保質(zhì)保鮮!
網(wǎng)址分享:http://m.5511xx.com/article/copjijj.html