Spring Cloud Alibaba+ Nacos 实现配置变化监听(动态刷新日志级别为例)

1,705 阅读1分钟

本文的前提:Nocas 配置中心环境搭建完成。

本文的内容:以监听 Nacos 配置中的 logLevel 字段的变化实现日志级别的动态刷新为例,介绍如何实现配置变化的监听。

配置监听器:

需要配置监听的 key、需要处理的业务等;

@Slf4j
@Component
public class LoggingLevelRefresher extends AbstractConfigChangeListener {

    // 需要监听的key
    private static final String KEY = "logLevel";

    @Value("${logLevel}")
    private String logLevel;

    @Resource
    private LoggingSystem loggingSystem;

    @PostConstruct
    public void init() {
        // 首次启动加载配置中
        loggingSystem.setLogLevel("com.fosafer", LogLevel.valueOf(logLevel));
    }

    /**
     * 当 key 值发生改变时,执行该方法,改变日志级别
     * @param event
     */
    @Override
    public void receiveConfigChange(ConfigChangeEvent event) {
        String logLevel = Optional.ofNullable(event.getChangeItem(KEY))
                .map(ConfigChangeItem::getNewValue).orElse("INFO");

//        loggingSystem.setLogLevel("ROOT", LogLevel.valueOf(logLevel));
        loggingSystem.setLogLevel("com.fosafer", LogLevel.valueOf(logLevel));

        log.error("[日志级别改动] {}", logLevel);
    }

}

添加监听器至 Nacos 服务

@Slf4j
@Configuration
public class NacosConfigListenerManager {
    @Resource
    NacosConfigManager nacosConfigManager;
    @Resource
    NacosConfigProperties configProperties;

    @Resource
    private LoggingLevelRefresher loggingLevelRefresher;

    @PostConstruct
    public void init() {
        try {
            for (NacosConfigProperties.Config extensionConfig : configProperties.getExtensionConfigs()) {
                ConfigService configService = nacosConfigManager.getConfigService();
                configService.addListener(extensionConfig.getDataId(), configProperties.getGroup(), loggingLevelRefresher);
            }
        } catch (NacosException e) {
            log.error("nacos 监听异常:", e);
        }
    }

}