前言
從這一篇開始我會分析SpringBoot整合Nacos是怎麼進行服務註冊的,從源碼的角度看看Springboot與nacos客戶端是怎麼進行整合的以及背後的實現原理。
源碼分析
組件註入
在項目中引入
spring-cloud-starter-alibaba-nacos-discovery依賴後,項目中引入了discovery的jar包在spring.factries文件下配置了這些信息,,截圖如下:
![](https://news.xinpengboligang.com/upload/keji/c471196d66974ed93a046f951549300a.jpeg)
discovery的spring.factries配置文件
可以看出標有EnableAutoConfiguration的對應的值有這些自動配置類,根據SpringBoot原理會加載這些自動配置類,其中在服務註冊的時候有一個自動配置類是
NacosDiscoveryAutoConfiguration,我們分析一下這個自動配置類,該類的代碼我復制出來如下:
package com.alibaba.cloud.nacos.discovery;
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.NacosServiceManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
public class NacosDiscoveryAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public NacosDiscoveryProperties nacosProperties() {
return new NacosDiscoveryProperties();
}
@Bean
@ConditionalOnMissingBean
public NacosServiceDiscovery nacosServiceDiscovery(
NacosDiscoveryProperties discoveryProperties,
NacosServiceManager nacosServiceManager) {
return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager);
}
}
首先往容器中放置一個NacosDiscoveryProperties對象,該對象綁定了
spring.cloud.nacos.discovery屬性,主要是把配置文件的內容綁定到該類上,該類的主要成員屬性有:
1.serverAddr
代表Nacos服務器端的地址。
2.username
登錄到Nacos服務器所需要的用戶名。
3.password
登錄到Nacos服務器所需要的密碼。
4.namespace
指定Nacos的命名空間,不同的命名空間是相互隔離的。
5.group
命名空間下的所屬分組,相同的命名空間不同分組也是相互隔離的。
再來看一下另外一個自動配置類它是
NacosServiceAutoConfiguration,該類的代碼如下:
package com.alibaba.cloud.nacos;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author yuhuangbin
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
public class NacosServiceAutoConfiguration {
@Bean
public NacosServiceManager nacosServiceManager() {
return new NacosServiceManager();
}
}
這個類主要是往容器中放入一個NacosServiceManager對象,該對象主要是建立一個與服務器端的長鏈接,類似於我分析的配置中心源碼中的NacosConfigManager對象。
還有一個核心自動配置類它是
NacosServiceRegistryAutoConfiguration,它是實現SpringBoot整合Nacos自動註冊到服務器端的關鍵組件,我們看看它的類內容如下:
package com.alibaba.cloud.nacos.registry;
import java.util.List;
import com.alibaba.cloud.nacos.ConditionalOnNacosDiscoveryEnabled;
import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration;
import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationAutoConfiguration;
import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration;
import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author xiaojing
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
*/
@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(
NacosServiceManager nacosServiceManager,
NacosDiscoveryProperties nacosDiscoveryProperties) {
return new NacosServiceRegistry(nacosServiceManager, 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對象、NacosRegistration對象、
NacosAutoServiceRegistration對象,這些組件的作用及其具體怎麼註冊到服務器的我會下節繼續分析。
總結:
本篇文章主要是介紹了SpringBoot整合Nacos往容器中都註入了哪些組件,以及他們之間的關系,下一節繼續看他們的執行流程,好了,我是愛好編程的程序員老徐,如果喜歡我的文章請點贊關註,我們下期見。