您好,登錄后才能下訂單哦!
小編給大家分享一下Nacos客戶端是如何在SpringCloud進行集成和實現的,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
故事要從頭Spring Boot的自動注入開始。很多朋友大概都了解過Spring Boot的自動配置功能,而Spring Cloud又是基于Spring Boot框架的。
因此,在學習Nacos注冊業務之前,我們先來回顧一下Spring Boot的自動配置原理,這也是學習的入口。
Spring Boot通過@EnableAutoConfiguration注解,將所有符合條件的@Configuration配置都加載到當前SpringBoot創建并使用的IoC容器。
上述過程是通過@Import(AutoConfigurationImportSelector.class)導入的配置功能,AutoConfigurationImportSelector中的方法getCandidateConfigurations,得到待配置的class的類名集合,即所有需要進行自動配置的(xxxAutoConfiguration)類,這些類配置于META-INF/spring.factories文件中。
最后,根據這些全限定名類上的注解,如:OnClassCondition、OnBeanCondition、OnWebApplicationCondition條件化的決定要不要自動配置。
了解了Spring Boot的基本配置之后,我們來看看Nacos對應的自動配置在哪里。
查看Spring Cloud的項目依賴,本人引入依賴對應的jar包為spring-cloud-starter-alibaba-nacos-discovery-2021.1.jar;
對應的pom依賴為:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
查看jar包中META-INF/spring.factories文件的內容:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\ com.alibaba.cloud.nacos.endpoint.NacosDiscoveryEndpointAutoConfiguration,\ com.alibaba.cloud.nacos.registry.NacosServiceRegistryAutoConfiguration,\ com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\ com.alibaba.cloud.nacos.discovery.reactive.NacosReactiveDiscoveryClientConfiguration,\ com.alibaba.cloud.nacos.discovery.configclient.NacosConfigServerAutoConfiguration,\ com.alibaba.cloud.nacos.NacosServiceAutoConfiguration org.springframework.cloud.bootstrap.BootstrapConfiguration=\ com.alibaba.cloud.nacos.discovery.configclient.NacosDiscoveryClientConfigServiceBootstrapConfiguration
可以看到EnableAutoConfiguration類對應了一系列的Nacos自動配置類。
其中NacosServiceRegistryAutoConfiguration是用來封裝實例化Nacos注冊流程所需組件的,裝載了對三個對象NacosServiceRegistry、NacosRegistration、NacosAutoServiceRegistration,這三個對象整體都是為了Nacos服務注冊使用的。
@Configuration(proxyBeanMethods = false) @EnableConfigurationProperties @ConditionalOnNacosDiscoveryEnabled @ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true) @AutoConfigureAfter({ AutoServiceRegistrationConfiguration.class, AutoServiceRegistrationAutoConfiguration.class, NacosDiscoveryAutoConfiguration.class }) public class NacosServiceRegistryAutoConfiguration { @Bean public NacosServiceRegistry nacosServiceRegistry( NacosDiscoveryProperties nacosDiscoveryProperties) { return new NacosServiceRegistry(nacosDiscoveryProperties); } @Bean @ConditionalOnBean(AutoServiceRegistrationProperties.class) public NacosRegistration nacosRegistration( ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers, NacosDiscoveryProperties nacosDiscoveryProperties, ApplicationContext context) { return new NacosRegistration(registrationCustomizers.getIfAvailable(), nacosDiscoveryProperties, context); } @Bean @ConditionalOnBean(AutoServiceRegistrationProperties.class) public NacosAutoServiceRegistration nacosAutoServiceRegistration( NacosServiceRegistry registry, AutoServiceRegistrationProperties autoServiceRegistrationProperties, NacosRegistration registration) { return new NacosAutoServiceRegistration(registry, autoServiceRegistrationProperties, registration); } }
其中NacosServiceRegistry封裝的就是注冊流程,它繼承自ServiceRegistry:
public class NacosServiceRegistry implements ServiceRegistry<Registration> {...}
查看該類源碼,可以看到該類中實現了服務注冊、注銷、關閉、設置狀態、獲取狀態5個功能。
我們要追蹤的服務注冊功能,便是通過它提供的register方法來實現的。
至此,我們可以梳理一下Nacos客戶端在Spring Cloud中集成并實例化的處理流程。
上面提到NacosServiceRegistry集成自ServiceRegistry,那么ServiceRegistry又是何方神圣呢?
ServiceRegistry接口是Spring Cloud的類,來看一下ServiceRegistry接口的定義:
public interface ServiceRegistry<R extends Registration> { void register(R registration); void deregister(R registration); void close(); void setStatus(R registration, String status); <T> T getStatus(R registration); }
可以看出ServiceRegistry接口中定義了服務注冊、注銷、關閉、設置狀態、獲取狀態五個接口。
如果看其他服務發現框架對Spring Cloud進行集成時,基本上都是實現的這個接口。也就是說,ServiceRegistry是Spring Cloud提供的一個服務發現框架集成的規范。對應的框架安裝規范實現對應的功能即可進行集成。
我們可以看到Eureka、Zookeeper、Consul在Spring Cloud中集成也都是實現了該接口,同時,如果你需要自定義服務發現功能,也可以通過實現該接口來達到目的。
暫且不關注其他的輔助類,直接來看NacosServiceRegistry#register方法,它提供了服務注冊的核心業務邏輯實現。
我們把該類的輔助判斷去掉,直接展示最核心的代碼如下:
@Override public void register(Registration registration) { // 獲取NamingService NamingService namingService = namingService(); String serviceId = registration.getServiceId(); String group = nacosDiscoveryProperties.getGroup(); // 構造實例,封裝信息來源于配置屬性 Instance instance = getNacosInstanceFromRegistration(registration); // 將實例進行注冊 namingService.registerInstance(serviceId, group, instance); }
上述代碼中NamingService已經屬于Nacos Client項目提供的API支持了。
關于Nacos Client的API流程查看,可直接查看Nacos對應的源碼,NamingService#registerInstance方法對應的流程圖整理如下:
上述流程圖還可以繼續細化,這個我們在后續章節中進行專門講解,這里大家知道大概的調用流程即可。
下面我們來梳理一下Spring Cloud是如何進行服務注冊的,其中流程的前三分之二部分幾乎所有的服務注冊框架都是一樣的流程,只有最后一部分進行實例注冊時會調用具體的框架來進行實現。
直接來看整個調用的鏈路圖:
圖中不同的顏色代表這不同的框架,灰色表示業務代碼,淺綠色表示SpringBoot框架,深綠色表示Spring框架,淺橙色表示SpringCloud框架,其中這一部分也包含了依賴的Nacos組件部分,最后淺紫色代表著Nacos Client的包。
核心流程分以下幾步:
第一步,SpringBoot在啟動main方法時調用到Spring的核心方法refresh;
第二步,在Spring中實例化了WebServerStartStopLifecycle對象。
重點說一下WebServerStartStopLifecycle對象,它的start方法被調用時會發布一個ServletWebServerInitializedEvent事件類,這個事件類繼承自WebServerInitializedEvent。后面用來處理服務注冊的類AbstractAutoServiceRegistration同時也是一個監聽器,專門用來監聽WebServerInitializedEvent事件。
第三步,AbstractApplicationContext的finishRefresh中會間接調用DefaultLifecycleProcessor的startBeans方法,進而調用了WebServerStartStopLifecycle的start方法。就像上面說的,觸發了ServletWebServerInitializedEvent事件的發布。
第四步,AbstractAutoServiceRegistration監聽到對應的事件,然后基于Spring Cloud定義的ServiceRegistry接口進行服務注冊。
上面的描述省略了一些部分細節,但整個流程基本上就是SpringBoot在啟動時發布了一個事件,Spring Cloud監聽到對應的事件,然后進行服務的注冊。
以上是“Nacos客戶端是如何在SpringCloud進行集成和實現的”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。