-
@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 |
否 |
最新更新
python爬虫及其可视化
使用python爬取豆瓣电影短评评论内容
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比