问题引入

使用过Nacos的同学都知道,当我们修改nacos配置后,应用后端是可以感知到配置信息变化了。比如当我在Nacos配置页面修改日志级别后,再去看应用日志输出,日志立马就改成了最新配置的输出级别。
但是,我们在properties或者yaml自定义的参数怎么可以实现这种自动更新呢?且往下看

局部配置参数自动更新

SrpingCloud参考

在引用了个别配置参数的类上使用@RefreshScope注解,这个注解是springcloud的。路径:org.springframework.cloud.context.config.annotation.RefreshScope
这样当配置文件对应的参数修改后,你就可以在类中使用最新的参数值了。举例如下:

  • yaml参数配置:
    在这里插入图片描述
  • 代码中使用对应参数
    在这里插入图片描述
  • Nacos官方例子:
    在这里插入图片描述
Srping-Boot参考

Nacos官方例子:

  • 启动类注解:
    在这里插入图片描述
  • 配置参数使用的这个注解哦:
    在这里插入图片描述
Srping参考
  • pom依赖:
    在这里插入图片描述
  • 配置类要加注解:
    在这里插入图片描述
  • 配置参数加注解:
    在这里插入图片描述
    官方配置代码库地址:
    https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-cloud-example/nacos-spring-cloud-config-example/pom.xml

主动监听参数更新

上面的配置都是针对单个配置参数实现自动更新的设置方法。这种设置的缺点是,更新后的参数在被代码使用时,才能感知是否生发变化了。如果想主动去监听参数变化,并且在参数变化后,第一是时间处理业务逻辑。就需要我们配置成主动监听参数变化了。具体操作如下:

Spring-Cloud实践版
  • 1)pom依赖
    我的springCloud版本是2.1.1.RELEASE,nacos版本是1.1.4,所以下面的依赖用的版本比较旧。
<dependency>
     <groupId>com.alibaba.nacos</groupId>
     <artifactId>nacos-spring-context</artifactId>
     <version>0.3.6</version>
 </dependency>
  • 2)启动类或者配置类加注解
    启动类和配置类二选一即可:
    1)启动类加注解:
    在这里插入图片描述
    2)配置类注解:
    在这里插入图片描述
  • 3)监听方法加注解 @NacosConfigListener
import com.alibaba.nacos.api.config.ConfigType;
import com.alibaba.nacos.api.config.annotation.NacosConfigListener;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.Properties;

/**
 * Description:nacos监听
 *
 * @author LiuLei
 * @version 1.0
 * @date 2024/2/20 16:01
 */
@Slf4j
//@Configuration
@Component
public class DataNacosListenConfig {
    // 1)String类型的方式接收的yaml格式不方便解析
//    @NacosConfigListener(dataId = "dta-tirs-data.yaml", type = ConfigType.YAML)
//    public void onReceived(String value) throws InterruptedException {
//        log.info("onReceived : {}", value);
//    }

    // 2)改用Properties接收,方便获取想要拿的参数
    @NacosConfigListener(dataId = "dta-tirs-data.yaml", type = ConfigType.YAML)
    public void onReceived(Properties value) {
        log.info("onReceived(Properties) : {}", value.getProperty("task.keep.life_cycle_policy_name"));
    }
}

测试效果,肉眼可见哦。
在这里插入图片描述

官方“栗子”

有兴趣的同学点开自己看吧。
https://nacos.io/zh-cn/docs/nacos-spring.html

https://github.com/nacos-group/nacos-spring-project/blob/master/nacos-spring-samples/nacos-spring-webmvc-sample/src/main/java/com/alibaba/nacos/samples/spring/listener/SimpleNacosConfigListener.java

答疑解惑

刚开始没看到官网有例子,各种百度,头都快百度烂了,死活使用@NacosConfigListener注解方法后,不生效!
1)网上有的类注释是@Configuration有的是@Component,其实最后都可以的。
2)nacos-spring-context 包必须必须得有,否则,@EnableNacosConfig 或者 @EnableNacos 你【压根】就没法使用哦!
这也是我刚开始没有成功的关键因素!
3)启动类或者配置文件得有@EnableNacosConfig 或者@EnableNacos用法在上面截图有。
这也是我只写了@NacosConfigListener,改了八十遍配置文件,死活监听不到变化的原因之一!
4)就是要注意版本,spring-cloud和naocs版本得匹配,nacos-spring-context的版本也得和spring-cloud版本匹配,否则部分方法或者参数不一致,会报错的。这个我也遇到了。最后就是降低版本解决的。

看帖子踩过的坑,我来填平!!!

1)必须依赖nacos-spring-context包,其实官网对应页面一开始就说了。看得懂,就明明白白,不会走弯路了。
https://nacos.io/zh-cn/docs/nacos-spring.html
在这里插入图片描述
2)

@EnableNacos是一个模块驱动的注解,它支持 Nacos Spring 的所有功能,包括服务发现和配置管理。它等于
@EnableNacosDiscovery 加上 @EnableNacosConfig,可以单独配置并在不同场景中使用。

官网原话,见上图。
然而,很多帖子,只给出了加@NacosConfigListener注解的方法,其他的都没有给出。生手,只能两眼一抹黑,瞎转悠了。

经验总结

找资料,帖子可能最容易看懂的,然而,帖子完整性、正确性,都不如官网。
所以,当我们遇到帖子解决不了的问题时,还是第一时间去看官网!看官网!看官网!一遍找不到,就多找几遍。慢慢找。
但凡,你能想到的功能,官网一般都会提供样例!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐