springboot简单集成diamond
diamond源码下载:https://github.com/gzllol/diamond。
搭建
Diamond -- 分布式配置中心
一、简介
Diamond是淘宝研发的分布式配置管理系统。使用Diamond可以让集群中的服务进程动态感知数据的变化,无需重启服务就可以实现配置数据的更新。
具有简单、可靠、易用等特点
二、使用方法
服务端搭建
1 准备工作
安装jdk
安装maven
安装tomcat
安装mysql
2 启动mysql并创建数据库和表
-- 创建Diamond数据库
CREATE DATABASE IF NOT EXISTS `diamond` /*!40100 DEFAULT CHARACTER SET utf8 */;
USE `diamond`;
-- 配置表
CREATE TABLE IF NOT EXISTS `config_info` (
`id` bigint(64) unsigned NOT NULL AUTO_INCREMENT,
`data_id` varchar(255) NOT NULL DEFAULT '',
`group_id` varchar(128) NOT NULL DEFAULT '',
`content` longtext NOT NULL,
`md5` varchar(32) NOT NULL DEFAULT '',
`src_ip` varchar(20) DEFAULT NULL,
`src_user` varchar(20) DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_config_datagroup` (`data_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- 数据导出被取消选择。
-- 组表
CREATE TABLE IF NOT EXISTS `group_info` (
`id` bigint(64) unsigned NOT NULL AUTO_INCREMENT,
`address` varchar(70) NOT NULL DEFAULT '',
`data_id` varchar(255) NOT NULL DEFAULT '',
`group_id` varchar(128) NOT NULL DEFAULT '',
`src_ip` varchar(20) DEFAULT NULL,
`src_user` varchar(20) DEFAULT NULL,
`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_group_address` (`address`,`data_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
3、打包
修改diamond-server/src/main/resources/system.properties文件,将diamond.server.addr的值换成Diamond服务器所在机器的ip地址
修改diamond-server/src/main/resources/jdbc.properties文件,配置mysql服务器的url,用户名和密码
diamond-server/src/main/resources/user.properties文件配置diamond登录账户,默认是:abc=123
修改diamond-client/src/main/java/com/taobao/diamond/client/DiamondConfigure.java类的loadConfig()方法
private void loadConfig() {
URL url = this.getClass().getClassLoader().getResource("diamond.properties");
if (url != null) {
File file = new File(url.getFile());
Properties prop = new Properties();
try {
prop.load(new FileInputStream(file));
configServerAddress = prop.getProperty(Constants.CONF_KEY_CONFIG_IP, Constants.DEFAULT_DOMAINNAME);
String portStr = prop.getProperty(Constants.CONF_KEY_PORT, "8080");
try {
port = Integer.parseInt(portStr);
} catch (NumberFormatException nfe) {
port = 8080;
}
//新增代码
configServerPort=port;
} catch (IOException e) {
}
}
}
在根目录执行打包命令
mvn clean package -Dmaven.test.skip=true
4、server部署
diamond-server/target/diamond-server.war解压
使用的apache-tomcat-6.0.37部署,需要发布到ROOT,默认源码里面的请求没有项目后缀
需要注意,tomcat的路径不要用空格,空格识别存在问题。
springboot简单集成diamond-client
把diamond-client-2.0.5.4.taocode-SNAPSHOT.jar和diamond-utils-2.0.5.4.taocode-SNAPSHOT.jar上传maven
mvn install:install-file -DgroupId=com.taobao.diamond -DartifactId=diamond-client -Dversion=2.0.5.4.taocode-SNAPSHOT -Dpackaging=jar -Dfile=F:\deploy\diamond-master\diamond-client\target\diamond-client-2.0.5.4.taocode-SNAPSHOT.jar
mvn install:install-file -DgroupId=com.taobao.diamond -DartifactId=diamond-utils -Dversion=2.0.5.4.taocode-SNAPSHOT -Dpackaging=jar -Dfile=F:\deploy\diamond-master\diamond-utils\target\diamond-utils-2.0.5.4.taocode-SNAPSHOT.jar
jar包引入:
com.taobao.diamond diamond-client 2.0.5.4.taocode-SNAPSHOT com.taobao.diamond diamond-utils 2.0.5.4.taocode-SNAPSHOT
创建ApplicationConfigurer.java进行读取diamond的配置内容,此文件暂时只能加载properties格式的配置内容
package com.wakeboy.config; import com.github.pagehelper.util.StringUtil; import com.taobao.diamond.manager.DiamondManager; import com.taobao.diamond.manager.ManagerListener; import com.taobao.diamond.manager.impl.DefaultDiamondManager; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.ConfigurationRuntimeException; import org.apache.commons.configuration.PropertiesConfiguration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import java.io.*; import java.net.URL; import java.util.*; import java.util.concurrent.Executor; /** * @program: ytsafe-parent * @Date: 2020/5/18 13:57 * @Author: liuhx * @Description:加载配置中心配置信息 * @Version 1.0 */ @Configuration public class ApplicationConfigurer { private static final Logger logger = LoggerFactory.getLogger(ApplicationConfigurer.class); //diamond系统配置的dataId String dataId; @Bean public PropertySourcesPlaceholderConfigurer createPropertySourcesPlaceholderConfigurer() throws ConfigurationException, IOException { PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); //加载diamond配置信息 loadDiamondConfig(); if(!StringUtil.isEmpty(dataId)){ String[] dataIds=dataId.split(","); for (int i = 0; i < dataIds.length; i++) { //diamond客户端调用服务端获取配置信息 DiamondManager manager = new DefaultDiamondManager(dataIds[i], new ManagerListener() { @Override public Executor getExecutor() { return null; } @Override public void receiveConfigInfo(String configInfo) { //配置信息动态修改将触发此方法 System.out.println("receive config: " + configInfo); propertyPlaceholderConfigurer.setProperties(getProperties(new StringReader(configInfo))); } }); /** * 同步获取一份有效的配置信息,按照本地文件->diamond服务器->上一次正确配置的snapshot * 的优先顺序获取, 如果这些途径都无效,则返回null * * @param timeout * 从网络获取配置信息的超时,单位毫秒 * @return 配置信息 */ String configInfo = manager.getAvailableConfigureInfomation(1000); //关闭 //manager.close(); //解析Propertie配置信息 propertyPlaceholderConfigurer.setProperties(getProperties(new StringReader(configInfo))); } } return propertyPlaceholderConfigurer; } /*** * @Description: 获取所有属性 * @param * @param in * @Return: java.util.Properties * @Author: liuhx * @Date: 2020/5/19 12:13 */ private Properties getProperties(StringReader in) { Mapmap=getPropertisMap(in); Properties properties = new Properties(); for (String key : map.keySet()) { properties.setProperty(key, map.get(key)); } return properties; } /*** * @Description: 解析文件内容 * @param * @param in * @Return: java.util.Map * @Author: liuhx * @Date: 2020/5/19 12:12 */ private Map getPropertisMap(StringReader in) { Map map=new HashMap (); PropertiesConfiguration.PropertiesReader reader = new PropertiesConfiguration.PropertiesReader(in); try { while (reader.nextProperty()) { String key = reader.getPropertyName(); String value = reader.getPropertyValue(); map.put(key, value); } } catch (IOException ioex) { throw new ConfigurationRuntimeException(ioex); } finally { try { reader.close(); } catch (IOException e) { logger.error("load config exception", e); }finally { return map; } } } /** * @Description: 加载diamond配置信息 * @param * @param * @Return: void * @Author: liuhx * @Date: 2020/5/19 15:41 */ private void loadDiamondConfig(){ URL url = this.getClass().getClassLoader().getResource("diamond.properties"); if (url != null) { File file = new File(url.getFile()); Properties prop = new Properties(); try { prop.load(new FileInputStream(file)); dataId=prop.getProperty("diamond.dataId"); } catch (IOException e) { } } } }
创建diamond.properties配置文件
diamond.port=8081 diamond.config.ip=127.0.0.1 diamond.dataId=1,2
项目启动截图