apollo 将一个命名空间内容加载到内存并监控配置变更

背景

业务中有这样一种场景:
 

在项目启动时把apollo某一个命名空间所有的配置读取到内存,并且监控配置的变化操作,再根据对页面配置的增修改来操作内存对象,后续程序再用到这个内存对象。 我这里的对象是中英文切换使用的翻译对象

配置

# apollo 相关配置
app:
  id: order-service # 与页面apollo 配置中心的 Appid一致

apollo:
  meta: http://localhost:8080 # Apollo中的Eureka注册中心地址
  #cluster:              #指定Apollo集群,相同集群实例使用对应集群的配置
  #cachDir:              #配置缓存目录, 网络不可用时任然可提供配置服务
  bootstrap:
    enabled: true  #启用apollo
   #namespaces: application,menu_EN_US

如果上面配置了启动,下面启动类就不用配置

代码

package com.lm.demo.init;


import com.ctrip.framework.apollo.Config;
import com.ctrip.framework.apollo.ConfigChangeListener;
import com.ctrip.framework.apollo.ConfigService;
import com.ctrip.framework.apollo.enums.PropertyChangeType;
import com.ctrip.framework.apollo.model.ConfigChange;
import com.ctrip.framework.apollo.model.ConfigChangeEvent;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

@Component
public class MenuChace {
    public static Map<String, String> codeMap = new HashMap<String, String>();

    @PostConstruct
    public void init(){
        // 获取某个名称空间的配置
        Config config = ConfigService.getConfig("menu_EN_US");
        //某个某个名称空间下,某个key的值
        String mysql_ip = config.getProperty("111", "");
        System.out.println(mysql_ip);

        //将所有的内容设置到map
        Set<String> names = config.getPropertyNames();
        for (String name : names) {
            String value = config.getProperty(name,name);
            codeMap.put(name,value);
        }
        //监控配置变化
        config.addChangeListener(new ConfigChangeListener() {
            public void onChange(ConfigChangeEvent changeEvent) {
                System.out.println("发生修改数据的命名空间是:" + changeEvent.getNamespace());
                for (String key : changeEvent.changedKeys()) {
                    ConfigChange change = changeEvent.getChange(key);
                    System.out.println(
                            String.format("发现修改 - 配置key: %s, 原来的值: %s, 修改后的值: %s, 操作类型: %s",
                                    change.getPropertyName(),
                                    change.getOldValue(), change.getNewValue(), change.getChangeType()));

                    String propertyName = change.getPropertyName();
                    String newValue = change.getNewValue();
                    //apollo配置操作类型 ADDED  MODIFIED  DELETED
                    PropertyChangeType changeType = change.getChangeType();
                    switch(changeType.name()) {
                        case "ADDED":
                            codeMap.put(propertyName,newValue);
                            break;
                        case "MODIFIED":
                            if(codeMap.containsKey(propertyName)){
                                codeMap.put(propertyName,newValue);
                            }
                            break;
                        case "DELETED":
                            codeMap.remove(propertyName);
                            break;
                        default:
                    }
                }
                System.out.println(codeMap.size());

            }
        });

        System.out.println(codeMap.size());
    }

    @PreDestroy
    public void destroy(){
        System.out.println("系统运行结束");
    }


}

 

效果

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值