服务端
首先把源码下载到本地,有几个地方需要修改,需要 eclipse + maven
diamond-server 是一个web项目 数据库用的mysql ,注意项目中的mysql驱动版本,我本地使用:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.35</version>
</dependency>
diamond-server打成war包之前,记得修改下数据库连接配置,如下
user.properties中的配置是web 登陆的账号密码
都修改好以后,打成war包部署到tomcat中,启动tomcat,访问http://ip:8080/diamond-server/
如下,点击配置信息管理,可以添加,查询,修改配置信息,信息格式为properties,可以直接把properties的内容复制粘贴过来
注意:部署好以后在tomcat中的webapps/diamond-server下新建文件diamond,文件内容为web部署的ip,有多个的话,一行一个
客户端
diamond-client 中是客户端代码 ,最终以jar包的形式被引用 ,在打包之前需要修改几个地方
需要修改的文件路径:/diamond-utils/src/main/java/com/taobao/diamond/common/Constants.java
diamond-utils 被服务端和客户端代码引用,在Constants.java中需要修改访问路径URI,最终如下
public static final String HTTP_URI_FILE = "/diamond-server/config.co";
public static final String CONFIG_HTTP_URI_FILE = "/diamond-server/diamond";
修改好以后打成jar包。
引用项目
这个项目就是我们自己的工程,我们需要把这个项目的配置放到配置中心,以后修改都在配置中心,如果配置中心的配置发生改变,项目能感知到并自动重新加载配置到内存,
如果有些配置是需要服务重启才能生效的,那必须重启服务。
先在我们的项目引入上面打好的jar包 diamond-client,然后写几个小段的代码,这里依赖spring,写好以后调用TshPropertyPlaceholderConfigurer 中的
loadOneConfigFromDiamond (单个配置)或者 loadMultConfigFromDiamond(多个配置)
package com.zhc365.tsh.test;
import java.io.IOException;
import java.io.StringReader;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
import com.taobao.diamond.manager.DiamondManager;
import com.taobao.diamond.manager.ManagerListener;
import com.taobao.diamond.manager.impl.DefaultDiamondManager;
/**
*
* @author yanzh 2015-09-10
*
*/
public class TshPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
private long timeOut = 3000;
Properties properties = new Properties();
/**
*
* @param group
* 配置中心的组名
* @param dataId
* 配置中心的ID
*
*/
public void loadOneConfigFromDiamond(String group, String dataId) {
DiamondManager manager = new DefaultDiamondManager(group, dataId, new ManagerListener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println("22222222:" + configInfo);
loadConfig(configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
});
String configInfo = manager.getAvailableConfigureInfomation(timeOut);
System.out.println("11111111:" + configInfo);
loadConfig(configInfo);
}
/**
* @param list
* map格式 为: map.put("group","aaa"); map.put("dataId","abc");
* key一定要书写正确,list中可以放多个map,用来获取多组配置
*/
public void loadMultConfigFromDiamond(List<Map<String, String>> list) {
if (null == list || list.size() < 1)
return;
String group = "";
String dataId = "";
for (Map<String, String> map : list) {
group = map.get("group");
dataId = map.get("dataId");
loadOneConfigFromDiamond(group, dataId);
}
}
private void loadConfig(String configInfo) {
try {
properties.load(new StringReader(configInfo));
} catch (IOException e) {
// System.out.println("装载properties失败:" + configInfo);
throw new RuntimeException("装载properties失败:" + configInfo, e);
}
this.setProperties(properties);
}
}
如何启动,根据你的项目情况来,可以用spring容器来启动,也可能用普通的servlet启动,还可以用main方法启动,如果有些配置是服务启动时需要用到的,那必须先初始化这些配置,比如
在TshDiamondClientTest 中,调用了TshPropertyPlaceholderConfigurer 中的方法
package com.zhc365.tsh.test;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TshDiamondClientTest extends TshPropertyPlaceholderConfigurer{
void init(){
//单个配置
this.loadOneConfigFromDiamond("tsh_server", "10001");
//多个配置
// List<Map<String,String>> list = new ArrayList<>();
// Map<String,String> map = new HashMap<>();
// map.put("group", "tsh_server");
// map.put("dataId", "10001");
// list.add(map);
//
// Map<String,String> map1 = new HashMap<>();
// map1.put("group", "tsh_server");
// map1.put("dataId", "10002");
// list.add(map1);
//
// Map<String,String> map2 = new HashMap<>();
// map2.put("group", "tsh_server");
// map2.put("dataId", "10003");
// list.add(map2);
// this.loadConfigFromDiamondMult(list);
}
}