背景
业务中有这样一种场景:
在项目启动时把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("系统运行结束");
}
}
效果