SpringBoot整合Nacos服務註冊加載原理一

2024年2月6日 16点热度 0人点赞

前言

從這一篇開始我會分析SpringBoot整合Nacos是怎麼進行服務註冊的,從源碼的角度看看Springboot與nacos客戶端是怎麼進行整合的以及背後的實現原理。

源碼分析

組件註入

在項目中引入
spring-cloud-starter-alibaba-nacos-discovery
依賴後,項目中引入了discovery的jar包在spring.factries文件下配置了這些信息,,截圖如下:

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往容器中都註入了哪些組件,以及他們之間的關系,下一節繼續看他們的執行流程,好了,我是愛好編程的程序員老徐,如果喜歡我的文章請點贊關註,我們下期見。