成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring Cloud集成Nacos服務發現源碼解析?翻了三套源碼,保質保鮮!

開發 架構
這篇文章就以Nacos提供的服務注冊功能為主線,來講解Nacos的客戶端是如何在Spring Cloud進行集成和實現的。

[[400273]]

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

前言

前面文章我們介紹了Nacos的功能及設計架構,這篇文章就以Nacos提供的服務注冊功能為主線,來講解Nacos的客戶端是如何在Spring Cloud進行集成和實現的。

本會配合源碼分析、流程圖整理、核心API解析等維度來讓大家深入淺出、系統的來學習。

Spring Boot的自動注冊

故事要從頭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中的Nacos自動配置

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

對應的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文件的內容:

  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類對應了一系列的Nacos自動配置類。

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

  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封裝的就是注冊流程,它繼承自ServiceRegistry:

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

查看該類源碼,可以看到該類中實現了服務注冊、注銷、關閉、設置狀態、獲取狀態5個功能。

我們要追蹤的服務注冊功能,便是通過它提供的register方法來實現的。

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

Spring Cloud的ServiceRegistry接口

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

ServiceRegistry接口是Spring Cloud的類,來看一下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接口中定義了服務注冊、注銷、關閉、設置狀態、獲取狀態五個接口。

如果看其他服務發現框架對Spring Cloud進行集成時,基本上都是實現的這個接口。也就是說,ServiceRegistry是Spring Cloud提供的一個服務發現框架集成的規范。對應的框架安裝規范實現對應的功能即可進行集成。

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

NacosServiceRegistry服務注冊實現

暫且不關注其他的輔助類,直接來看NacosServiceRegistry#register方法,它提供了服務注冊的核心業務邏輯實現。

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

  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.     // 構造實例,封裝信息來源于配置屬性 
  10.     Instance instance = getNacosInstanceFromRegistration(registration); 
  11.     // 將實例進行注冊 
  12.     namingService.registerInstance(serviceId, group, instance); 

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

關于Nacos Client的API流程查看,可直接查看Nacos對應的源碼,NamingService#registerInstance方法對應的流程圖整理如下:

上述流程圖還可以繼續細化,這個我們在后續章節中進行專門講解,這里大家知道大概的調用流程即可。

Spring Cloud服務注冊鏈路

下面我們來梳理一下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監聽到對應的事件,然后進行服務的注冊。

小結

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

 

責任編輯:武曉燕 來源: 程序新視界
相關推薦

2021-08-10 07:00:00

Nacos Clien服務分析

2009-08-01 21:58:24

布線質量

2022-02-07 07:10:32

服務注冊功能

2021-07-12 08:00:21

Nacos 服務注冊源碼分析

2009-03-18 14:47:14

LinuxUbuntu 9.04主題

2022-12-07 08:02:43

Spring流程IOC

2023-12-23 18:04:40

服務Eureka工具

2013-11-28 10:09:49

微軟移動端系統

2021-08-27 07:47:07

Nacos灰度源碼

2021-07-16 06:56:50

Nacos注冊源碼

2023-01-10 07:52:15

2021-06-07 14:06:19

Spring SecuCSRF防御

2012-06-18 16:18:56

移動電源

2025-05-27 08:05:00

Spring開發服務調用

2023-02-28 08:57:06

Spring上下線緩存

2022-05-08 17:53:38

Nacos服務端客戶端

2022-05-06 07:52:06

Nacos服務注冊

2021-08-09 07:58:36

Nacos 服務注冊源碼分析

2009-02-23 13:57:13

2017-06-25 13:33:25

Spring Clou微服務架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久中文字幕 | 欧美视频1区| 欧美456| 日韩精品一区在线 | 天天操天天干天天透 | 亚洲天堂一区二区 | 日本不卡免费新一二三区 | 国产91视频一区二区 | 日韩久久精品 | 国产成人精品免高潮在线观看 | 97av视频| 成人精品在线观看 | 久久久久久久久蜜桃 | 久久久久91| 国产精品久久久久一区二区三区 | 日韩视频免费看 | 亚洲一区中文字幕 | 在线观看国产视频 | 激情久久av一区av二区av三区 | 91精品国产综合久久精品图片 | 欧美成人一级 | 精品国产区 | 国产一区二区三区视频 | 一区二区三区久久久 | 欧美精品在线免费观看 | 亚洲视频在线看 | 成人一级视频在线观看 | 国产免费福利小视频 | 久久69精品久久久久久久电影好 | 日韩中文字幕av | 国产欧美一区二区三区另类精品 | 国产99免费 | 二区不卡 | 免费在线观看成年人视频 | 久久久国产精品 | 久久久久久久久久久一区二区 | 日本一二三区电影 | 久久国内| 日日欧美 | 黄色大片免费看 | 视频一区二区三区四区五区 |