这是本人第一次写博,有不当之处敬请指正
首先感谢config-toolkit 开发者 wangyuxuan
由于分布式项目修改某个值,就需要所有应用中的配置均需要修改, 所以项目需要将配置集中管理,在wangyuxuan大哥的帮助下,顺利完成了config-toolkit与项目集成,本文是个人在集成config-toolkit时的心得
config-toolkit 下载地址:https://github.com/dangdangdotcom/config-toolkit 在此地址中作者介绍了config-toolkit的作用以及使用
本文在此基础上进行详细集成说明:
开发环境:win7、jdk1.6、spring3.2、tomcat7、zookeeper3.3.6
配置文件类型; *.properties
本人项目中使用config-toolkit特点:
实现配置热更新 (举例; 应用中上传文件的路径需要修改,无需停服务就可以实时更改)版本控制,支持灰度发布 (举例:多个应用使用不同的配置,可以快速从测试环境的配置更改到正式环境的配置)
下载config-toolkit,将config-web工程进行打成war包,部署到tomcat7下
注:由于config-web使用了鉴权密码,故需要执行以下python程序
python -c "import hashlib;print hashlib.sha1('abc').hexdigest();"
# a9993e364706816aba3e25717850c26c9cd0d89d
echo "set /aaa/bbb a9993e364706816aba3e25717850c26c9cd0d89d" |./zkCli.sh -server localhost:2181
由于本人不想执行python程序,故修改源代码AuthDao.java,为了快速进入控制界面,此处请原作者原谅
@Override
public boolean checkAuth(String nodeName, String password) {
LOGGER.debug("Check auth: [{}]", nodeName);
String hash = password; //sha1Digest(password);
boolean isPass = false;
try {
// 判断节点是否存在
Stat stat = getClient().checkExists().forPath(nodeName);
System.out.println("--------------------------stat:"+stat);
System.out.println("--------------------------stat:"+ stat != null);
if (stat != null) {
byte[] data = getClient().getData().forPath(nodeName);
System.out.println("--------------------------data:"+ data);
System.out.println("--------------------------data String:"+ new String(data));
System.out.println("--------------------------hash:"+hash);
isPass = hash.equals(new String(data));
System.out.println("--------------------------isPass:"+ isPass);
}
} catch (Exception e) {
throw Throwables.propagate(e);
}
return isPass;
}
给根节点创建版本号,上传或者创建配置文件
Spring PlaceholderConfigurer集成
注:此集成仅支持spring3.2以上版本
config-group1
config-group2
config-group3
集成完毕,使用SPEL读取配置值
此集成方式不支持热更新,不需要进行热更新的配置建议使用此集成方式
此方式支持spring3.0以上
编写config-toolkit.properties
#zookeeper服务地址
zk.address=10.100.15.173:8900
#zookeeper节点版本 用于灰度发布
zk.version=2.0.0
将configNode交给spring管理,将以下代码copy到spring配置文件
将configNode注入到业务bean中
@Component
public class ExampleBeanWithSpel {
@Autowired
private ConfigNode configNode;
public void someMethod() {
System.out.println(configNode);
System.out.println(configNode.get("passWord"));
}
}
测试热更新结果
ApplicationContext applicationContext;
ExampleBeanWithSpel jdbcTemplate = (ExampleBeanWithSpel)applicationContext.getBean("exampleBeanWithSpel");
jdbcTemplate.someMethod();
灰度发布主要靠cofig-toolkit中的版本控制实现,详见 热更新配置集成 章节内容
简单介绍:
在configWeb管理界面给节点设置多个版本,举例:生产环境版本为 1.0.0 测试环境A版本为2.0.0 测试环境B版本号为3.0.0
每个版本维护了各自的配置信息, 如果想切换不同环境的配置,只需要将config-toolkit.properties文件中的版本号修改为需要切换的版本号即可