监听 apollo 配置变化

监听 apollo 配置 cleanPrecisionVersion 变化的类

源码

@Component
@Order(value = Ordered.HIGHEST_PRECEDENCE)
@Slf4j
public class InitApolloConfigure implements CommandLineRunner {

	// 内存缓存
    private volatile ConcurrentHashMap<String, List<String>> cleanPrecisionMap = new ConcurrentHashMap();
    // apollo 中配置 cleanPrecision 版本的 KEY
    private static final String CLEAN_PRECISION_VERSION = "cleanPrecisionVersion";
    //inject config for namespace application
    @ApolloConfig
    private Config config;
    @Reference(version = "${dubbo.order.application.version}")
    private ICleanPrecisionConfigBiz cleanPrecisionConfigBiz;

    @Override
    public void run(String... args) throws Exception{
        // 加载 namespace application 的配置
        Set<String> configs = config.getPropertyNames();
        if (CollectionUtils.isNotEmpty(configs)) {
            // 项目启动,加载数据到内存中
            setInitCleanPrecisionMap();
            monitorApolloConfigurationChange(config);
        }

    }

    private void setInitCleanPrecisionMap() {
        List<CleanPrecisionConfig> list = cleanPrecisionConfigBiz.getCleanPrecisionConfigList();
        if (CollectionUtils.isEmpty(list)) {
            // 手动抛出运行时异常
            String initCleanPrecisionMapMsg = "项目启动,查询 DB 为空!" + " 服务器 IP:" + IpUtil.getIp();
            throw new RuntimeException(initCleanPrecisionMapMsg);
        } else {
            setMap(list);
        }

    }

    private void monitorApolloConfigurationChange(Config config) {
        config.addChangeListener(configChangeEvent -> {
            // 监听 apollo 配置中发生变化的 KEY
            Set<String> keys = configChangeEvent.changedKeys();
            if (CollectionUtils.isNotEmpty(keys) && keys.contains(CLEAN_PRECISION_VERSION)) {
                // KEY 变化,重新加载数据到内存中
                setUpdateCleanPrecisionMap();
            }
        });

    }

}

参考文档

### Apollo 配置中心实现监听配置变化方法 在分布式环境中,Apollo配置中心提供了强大的功能来实现实时监听配置变化并做出响应。当配置发生变化时,应用程序能够立即获取最新的配置信息而无需重启。 #### 客户端监听机制 通过`ConfigChangeListener`接口可以在应用层面上注册监听器以捕获任何更改事件[^3]: ```java // 创建一个监听器实例 Config config = ConfigService.getConfig("application"); config.addChangeListener(new ConfigChangeListener() { @Override public void onChange(ConfigChangeEvent changeEvent) { // 处理变更逻辑 for (String key : changeEvent.changedKeys()) { System.out.println(String.format("Changed key:%s | oldValue:%s | newValue:%s ", key, changeEvent.getChange(key).getOldValue(), changeEvent.getChange(key).getNewValue())); } } }); ``` 这段代码展示了如何创建一个监听特定命名空间(`application`)下的所有键值对变动情况的处理器,并打印出每次改动的具体细节。 #### 自动刷新属性注入 对于Spring框架集成场景下,还可以利用`@Value`注解配合`${}`语法自动绑定环境变量至Java Bean字段上;更重要的是借助于`@RefreshScope`作用域修饰符使得Bean能够在运行期间动态加载新的配置数据而不必重新部署整个项目[^4]: ```java @RestController @RequestMapping("/api/v1/demo") @RefreshScope // 启用此标记可以让控制器内的依赖项支持即时生效 public class DemoController { @Value("${demo.message}") private String message; @GetMapping("/hello") public ResponseEntity<String> sayHello(){ return new ResponseEntity<>(message , HttpStatus.OK); } } ``` 上述例子中的RESTful API会随着外部源提供的`demo.message`参数调整其返回的内容,即使是在不停机的情况下也能完成更新过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值