基于spring-boot框架,监听nacos配置变化(比如运行中改变日志级别)

背景

如果想在运行过程中想基于nacos数据变更做一些业务,比如想在运行过程中变更日志的级别,那么我们可以扩展nacos的监听。

步骤
  • 定义一个配置类,用@NacosConfigListener标记需要触发的方法,并用dataId标记需要监听的文件。如下:
/**
 * 日志级别 nacos动态调整
 */
@Slf4j
@Configuration
public class LoggingLevelConfig {

    /**
     * 动态刷新
     */
    @NacosConfigListener(dataId = Constants.CONFIG_FILE_NAME)
    public void refresh(String msg) {

    }
}

需要注意的是这个方法必须要有一个String类型参数,否则不会生效;这个参数就是变更后的文件;

  • 解析变更内容
    这里有两个思路
    • 第一个是自己解析字符串;
    • 第二个就是利用nacos自动刷新的机制,定义一个配置属性类,然后从这个类里面获取最新的属性值;这里要注意的是被 @NacosConfigListener标记的方法和nacos自动刷新的先后顺序是不能被保证的;我的思路是,开启一个新线程然后可以Sleep几秒后从配置类中读取最新的值。

所以最终的代码:

@Slf4j
@Configuration
public class DemoLoggingLevelConfig {

    @Resource
    private SomePropertiesConfig propertiesConfig;

    /**
     * LoggingSystem
     */
    @Resource
    private LoggingSystem loggingSystem;

    /**
     * 通用线程池
     */
    @Resource(name = "commonTaskExecutor")
    private ThreadPoolTaskExecutor commonTaskExecutor;

    /**
     * 动态刷新
     */
    @NacosConfigListener(dataId = Constants.FILE_NAME)
    public void refresh(String msg) {
       // 线程池处理多线程
        taskExecutor.submit(() -> {
            try {
                Thread.sleep(4000);
                log.info("获取到最新的值:{}", propertiesConfig.getDynamicLogger());
// 通过loggingSystem
            } catch (Exception e) {
                log.error("异常:{}", e.getLocalizedMessage(), e);
            }
        });
    }
}

over~

你可能感兴趣的:(JAVA,java)