VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Java教程 >
  • @EnableDiscoveryClient与Nacos自动注册

前一阵看到有篇博客说cloud从Edgware版本开始,可以不加@EnableDiscoveryClient注解,只要配置好注册中心的相关配置即可自动开启服务注册功能,比较好奇其中的原理,研究了一番特意记录下来

环境:

  SpringBoot:  2.3.5

  SpringCloud: Hoxton.SR8

  SpringCloudAlibaba: 2.2.3

 

先看一下@EnableDiscoveryClient注解,只有一个属性:autoRegister, 默认为true

复制代码
@SpringBootApplication
@EnableDiscoveryClient(autoRegister = true)
public class NacosApplication {
    
    public static void main(String[] args) {
        SpringApplication.run(NacosApplication.class, args);
    }
    
}

内部信息(代码里只保留了重点)

复制代码
@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {
    boolean autoRegister() default true;
}

 

EnableDiscoveryClientImportSelector

复制代码
@Override
public String[] selectImports(AnnotationMetadata metadata) {
    String[] imports = super.selectImports(metadata);

    AnnotationAttributes attributes = AnnotationAttributes.fromMap(
        metadata.getAnnotationAttributes(getAnnotationClass().getName(), true));
    //获取@EnableDiscoveryClient的autoRegister属性
    boolean autoRegister = attributes.getBoolean("autoRegister");
    //开启自动注册的话,将AutoServiceRegistrationConfiguration类的全限定名返回,会被spring加载到bean容器
    if (autoRegister) {
        List<String> importsList = new ArrayList<>(Arrays.asList(imports));
        importsList.add(
            "org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
        imports = importsList.toArray(new String[0]);
    }
    //关闭自动注册的话,将***.auto-registration.enabled设置为false,放入环境属性中(其他地方会用到)
    else {
        Environment env = getEnvironment();
        if (ConfigurableEnvironment.class.isInstance(env)) {
            ConfigurableEnvironment configEnv = (ConfigurableEnvironment) env;
            LinkedHashMap<String, Object> map = new LinkedHashMap<>();
            map.put("spring.cloud.service-registry.auto-registration.enabled", false);
            MapPropertySource propertySource = new MapPropertySource(
                "springCloudDiscoveryClient", map);
            configEnv.getPropertySources().addLast(propertySource);
        }
    }
    return imports;
}

 

AutoServiceRegistrationConfiguration是实现自动注册的入口,具体的逻辑在由注册中心实现(如Nacos\Eureka...)

复制代码
//当**.registration.enabled属性为true时,此配置类会被加载
//spring-cloud-commons.jar包内的spring-configuration-metadata.json定义了此属性默认为true
//即: 不配置@EnableDiscoveryClient或者配置@EnableDiscoveryClient设置autoRegister为true时
//AutoServiceRegistrationConfiguration会被加载,当@EnableDiscoveryClient的autoRegister
//属性为false时,此配置类不会被加载
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled",
        matchIfMissing = true)
public class AutoServiceRegistrationConfiguration {

}

 

 

Nacos实现逻辑

 

复制代码
配置:
spring:
  application:
    name: nacosTest
  cloud:
    nacos:
      discovery:
        enabled: true(默认为true,可以不配置)
        server-addr: 192.168.1.10
        port: 8848
        username: nacos
        password: nacos 

 

spring-cloud-starter-alibaba-nacos-discovery.jar/META-INF/spring.factories:

复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.alibaba.cloud.nacos.discovery.NacosDiscoveryAutoConfiguration,\
  com.alibaba.cloud.nacos.ribbon.RibbonNacosAutoConfiguration,\
  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

 

打开NacosServiceRegistryAutoConfiguration.java, 内部实现了服务自动注册逻辑

复制代码
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties
//确保spring.cloud.nacos.discovery.enabled为true(开启nacos的服务注册与发现功能)
@ConditionalOnNacosDiscoveryEnabled
//默认为true,只有开启了@EnableDiscoveryClient注解,并且配置autoRegister为false时,
//此属性值才为false
@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);
    }
}

 

  

最后测试:

配置

是否成功注册到注册中心

不配置@EnableDiscoveryClient,不配置nacos.discovery.enable

不配置@EnableDiscoveryClient,配置nacos.discovery.enable=false

配置@EnableDiscoveryClient,配置nacos.discovery.enable=true

配置@EnableDiscoveryClient,配置nacos.discovery.enable=false

配置@EnableDiscoveryClient(autoRegister=false),配置nacos.discovery.enable=true

配置@EnableDiscoveryClient(autoRegister=false),配置nacos.discovery.enable=false

本文作者:Java挖坑工程师

本文链接:https://www.cnblogs.com/llysc/p/14982849.html



相关教程