springboot简单集成diamond实现配置中心

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实现配置中心_第1张图片

 

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) {
        Map map=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

项目启动截图

springboot简单集成diamond实现配置中心_第2张图片

 

你可能感兴趣的:(diamond)