nacos 配置动态刷新

文章介绍了Nacos配置动态刷新的实现原理,包括通过Nacos客户端定时任务检测配置变化,触发事件,然后由RefreshEventListener监听并更新ApplicationContext中的配置,利用RefreshScope清除并重新创建配置类对象以实现配置的动态更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用方式

  1. 创建配置类,在类增加注解
    @Component
    @RefreshScop
  2. 类属性上增加注解
    @Value

原理分析

依赖包

  1. spring-cloud-context:2.2.9.RELEASE
  2. spring-cloud-starter-alibaba-nacos-config:2.2.8.RELEASE

获取nacos更新数据,发送更新事件。

  1. spring-cloud-starter-alibaba-nacos-config的spring.factories文件配置了NacosConfigAutoConfiguration,在该类配置了Nacos数据刷新的bean。NacosContextRefresher。

在这里插入图片描述
2. NacosContextRefresher类。在这里插入图片描述在这里插入图片描述
3. NacosConfigService类,在类中将listener放入到CacheData中,在NacosConfigService的构造函数中创建一个ClientWorker对象,ClientWorker包含一个定时任务,定时获取Nacos数据。
在这里插入图片描述

在这里插入图片描述
4. ClientWorker类每5秒执行一次executeConfigListen。在这里插入图片描述
在这里插入图片描述
5. cacheData调用Listener,此处的Listener有刚才在步骤2 NacosContextRefresher中设置的匿名类,发布RefreshEvent事件。
在这里插入图片描述

监听更新事件

  1. spring-cloud-context包spring.factories中通过EnableAutoConfiguration配置了自动刷新配置类RefreshAutoConfiguration。
    在这里插入图片描述
  2. 配置bean对象,RefreshEventListener,ContextRefresher,RefreshScope。当配置更新时发布RefreshEvent事件。RefreshEventListener监听到该事件调用onApplicationEvent方法,onApplicationEvent会调用ContextRefresher的refresh方法,在refresh方法中检查ConfigurableApplicationContext的环境ConfigurableEnvironment中的属性变化,更新ConfigurableEnvironment中变化的属性值,清除RefreshScope中缓存的配置类对象。在获取配置类bean对象时由于RefreshScope的缓存被清楚了,所以会从ConfigurableEnvironment中获取属性值重新创建配置类对象,达到动态更新配置的目的。在这里插入图片描述
    在这里插入图片描述
  3. 环境变量的值获取是通过NacosPropertySourceLocator获取的,在NacosConfigBootstrapConfiguration中配置。

配置类的创建

  1. RefreshScopeBeanDefinitionEnhancer的postProcessBeanDefinitionRegistry方法中生成类的代理,配置为ScopedProxyFactoryBean在这里插入图片描述
    在这里插入图片描述
  2. jdk动态代理JdkDynamicAopProxy,targetSource是前面一个步骤中设置的scopedTargetSource。
    ProxyFactory pf = new ProxyFactory();
    pf.copyFrom(this);
    pf.setTargetSource(this.scopedTargetSource);在这里插入图片描述
    3. scopedTargetSource 的类型为SimpleBeanTargetSource 。获取bean对象。在这里插入图片描述
    在这里插入图片描述
    总结:
    1 定时任务获取通过ClientWorker获取Nacos配置,对获取的配置md5运算与目前的配置的md5比较,如配置发生变化则发送RefreshEvent事件。
    2 RefreshEventListener监听到该事件则将ApplicationContext中的环境变量做比较(新创建了一个环境变量,使用了SpringApplication的run方法重新对环境变量进行了初始化,使用NacosPropertySourceLocator重新获取了Nacos配置值,然后比较环境变量更新前后的差异),如果发生变化则清空RefreshScope中缓存的配置类Bean。
    3 每次在获取配置的时都会通过代理调用getTarget方法获取被代理的配置类,先从RefreshScope中获取,没有则重新创建。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值