最近因为项目管理上的需要,调研集中式管理工具。
百度Disconf、携程Apollo、阿里ACM ,三者都可以满足集中式配置,并提供监听,实时改变配置。
关于3个框架的使用以及搭建请自行参考官方API文档,不再叙述。对比了3个框架的配置,如下。
disconf 依赖比较多,比如zookeeper等都需要提供环境;
apollo依赖较少,只有一个db。阿波罗在多环境配置时,需要搭建多个config-server,这种结构非常干净,但是多环境产生成本,所以暂未使用。
ACM阿里目前是不收费的,我们因为用了很多阿里云的服务,所以集成比较方便。
3者的核心都是提供一个配置中心,提供分布式的服务,并提供监听。ACM文档内有spring-cloud的支持。
集成时,对于运行时变量可以通过监听配置;对于spring启动配置参数,可以参考PropertyPlaceholderConfigurer读取配置文件,自定义一个读取类,集成第三方监听。改进后的结构如下,启动时根据远程配置更新本地读取到的properties配置。
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props) throws BeansException {
super.processProperties(beanFactoryToProcess, props);
//taosj 20180829 读取完properties之后;根据阿里云的配置,更新properties,并启动监听
try {
this.logger.info("Start load ACM configuration.");
AcmConfig acmConfig = this.getConfig(props);
this.registerAcm(acmConfig, props);
} catch (Exception e) {
this.logger.error("{}", e);
}
ACM_PROP_MAP = new HashMap<String,String>();
for (Object key : props.keySet()){
String keyStr = key.toString();
String value = String.valueOf(props.get(keyStr));
ACM_PROP_MAP.put(keyStr,value);
}
}