自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring Cloud集成Nacos服務(wù)發(fā)現(xiàn)源碼解析?翻了三套源碼,保質(zhì)保鮮!

開(kāi)發(fā) 架構(gòu)
這篇文章就以Nacos提供的服務(wù)注冊(cè)功能為主線,來(lái)講解Nacos的客戶端是如何在Spring Cloud進(jìn)行集成和實(shí)現(xiàn)的。

[[400273]]

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

前言

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

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

Spring Boot的自動(dòng)注冊(cè)

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

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

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

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

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

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

Spring Cloud中的Nacos自動(dòng)配置

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

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

  1. <dependency> 
  2.     <groupId>com.alibaba.cloud</groupId> 
  3.     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 
  4. </dependency> 

查看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類對(duì)應(yīng)了一系列的Nacos自動(dòng)配置類。

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

  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.  
  11.     @Bean 
  12.     public NacosServiceRegistry nacosServiceRegistry( 
  13.             NacosDiscoveryProperties nacosDiscoveryProperties) { 
  14.         return new NacosServiceRegistry(nacosDiscoveryProperties); 
  15.     } 
  16.  
  17.     @Bean 
  18.     @ConditionalOnBean(AutoServiceRegistrationProperties.class) 
  19.     public NacosRegistration nacosRegistration( 
  20.             ObjectProvider<List<NacosRegistrationCustomizer>> registrationCustomizers, 
  21.             NacosDiscoveryProperties nacosDiscoveryProperties, 
  22.             ApplicationContext context) { 
  23.         return new NacosRegistration(registrationCustomizers.getIfAvailable(), 
  24.                 nacosDiscoveryProperties, context); 
  25.     } 
  26.  
  27.     @Bean 
  28.     @ConditionalOnBean(AutoServiceRegistrationProperties.class) 
  29.     public NacosAutoServiceRegistration nacosAutoServiceRegistration( 
  30.             NacosServiceRegistry registry, 
  31.             AutoServiceRegistrationProperties autoServiceRegistrationProperties, 
  32.             NacosRegistration registration) { 
  33.         return new NacosAutoServiceRegistration(registry, 
  34.                 autoServiceRegistrationProperties, registration); 
  35.     } 

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

  1. public class NacosServiceRegistry implements ServiceRegistry<Registration> {...} 

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

我們要追蹤的服務(wù)注冊(cè)功能,便是通過(guò)它提供的register方法來(lái)實(shí)現(xiàn)的。

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

Spring Cloud的ServiceRegistry接口

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

ServiceRegistry接口是Spring Cloud的類,來(lái)看一下ServiceRegistry接口的定義:

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

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

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

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

NacosServiceRegistry服務(wù)注冊(cè)實(shí)現(xiàn)

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

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

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

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

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

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

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

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

直接來(lái)看整個(gè)調(diào)用的鏈路圖:

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

核心流程分以下幾步:

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

第二步,在Spring中實(shí)例化了WebServerStartStopLifecycle對(duì)象。

重點(diǎn)說(shuō)一下WebServerStartStopLifecycle對(duì)象,它的start方法被調(diào)用時(shí)會(huì)發(fā)布一個(gè)ServletWebServerInitializedEvent事件類,這個(gè)事件類繼承自WebServerInitializedEvent。后面用來(lái)處理服務(wù)注冊(cè)的類AbstractAutoServiceRegistration同時(shí)也是一個(gè)監(jiān)聽(tīng)器,專門(mén)用來(lái)監(jiān)聽(tīng)WebServerInitializedEvent事件。

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

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

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

小結(jié)

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

 

責(zé)任編輯:武曉燕 來(lái)源: 程序新視界
相關(guān)推薦

2021-08-10 07:00:00

Nacos Clien服務(wù)分析

2009-08-01 21:58:24

布線質(zhì)量

2022-02-07 07:10:32

服務(wù)注冊(cè)功能

2021-07-12 08:00:21

Nacos 服務(wù)注冊(cè)源碼分析

2009-03-18 14:47:14

LinuxUbuntu 9.04主題

2022-12-07 08:02:43

Spring流程IOC

2021-08-27 07:47:07

Nacos灰度源碼

2023-12-23 18:04:40

服務(wù)Eureka工具

2021-07-16 06:56:50

Nacos注冊(cè)源碼

2013-11-28 10:09:49

微軟移動(dòng)端系統(tǒng)

2023-01-10 07:52:15

2021-06-07 14:06:19

Spring SecuCSRF防御

2022-05-06 07:52:06

Nacos服務(wù)注冊(cè)

2022-05-08 17:53:38

Nacos服務(wù)端客戶端

2023-02-28 08:57:06

Spring上下線緩存

2021-08-09 07:58:36

Nacos 服務(wù)注冊(cè)源碼分析

2022-03-07 10:05:02

SpringStreamMQ連接

2012-06-18 16:18:56

移動(dòng)電源

2017-06-25 13:33:25

Spring Clou微服務(wù)架構(gòu)

2021-04-18 07:33:20

項(xiàng)目Springboot Nacos
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)