一.概述
nacos是阿里巴巴最新开源的配置管理和服务发现的一款中间件,这里主要针对配值中心的功能的部分进行分析。如果之前经常使用阿里技术栈的同学们应该不陌生,在更早的时间以前,阿里开源过一个叫diamond的分布式配置中心,实际上nacos在配置中心 的功能上基本和diamond相似,但nacos的生态更为丰富。后面会对比下两个的部分差异。
二.示例
这里主要介绍内存实时更新的原理分析,示例就拿官网的好了
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfiguration {}
@Controller
@RequestMapping("config")
public class ConfigController {
@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
然后通过OPEN API或者调用SDK, 或者控制台的方式改变useLocalCache 的值,然后再次调用get对应的值,发现字段的值已经发生变化。
三.源码分析
由上面可以看出,在不重启应用的情况下,通过修改配置中心的配置项值,可以实现配置项的动态刷新,那么其原理是如何的呢?
我们一起来分析下;
在这个过程中,起重要作用的三个注解
1.@EnableNacosConfig
2.@NacosPropertySource
3.@NacosValue
这里插一句,实际上现在很多框架和中间件都借鉴了annotation-driven的思想,这里面也不例外,通过注解驱动,来配置对应的注解处理器来实现对应的需求
首先看第二个@NacosPropertySource,这个是指定了应用的配置坐标,groupId和dataId,这个使用过到diamond和nacos应该都熟悉,是指对应的配置组ID和数据ID
主要起动作的还是第一个,@EnableNacosConfig,这个,我们点开后,里面主要起作用的是Import(NacosConfigBeanDefinitionRegistrar.class),接着看 NacosConfigBeanDefinitionRegistrar,这个类继承了三个spring原生的接口,ImportBeanDefinitionRegistrar, EnvironmentAware, 和 BeanFactoryAware
其中ImportBeanDefinitionRegistrar 这个是Spring bean的注册器接口,用于bean的动态注入,而这里NacosConfigBeanDefinitionRegistrar就是用于处理nacos