使用当当网的Config Toolkit集中管理配置数据

1、首先下载该项目源码

https://download.csdn.net/download/qq_34021712/10317654?utm_source=bbsseo

2、将config-zk-web这个maven工程打包,可以得到一个war,这就是配置管理界面后台。

cd config-toolkit/config-zk-web/
mvn clean package

3、启动zookeeper server

5、将war部署到tomcat下,就可以通过http://127.0.0.1:8080/config-web/访问

可以通过修改/config-web/WEB-INF/classes/zk.properties来修改注册中心地址

6、创建项目需要的根节点,并对内容进行加密。比如我们的根节点是/PAYCENTER,数据内容是123456。为了能在配置管理界面连接这个节点,需要对内容进行SHA1加密。

import com.google.common.hash.Hashing;
 
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
 
 
public class SHA1 {
    public static void main(String[] args) throws NoSuchAlgorithmException {
 
        // 7c4a8d09ca3762af61e59520943dc26494f8941b
        String password = SHA1("123456");
        System.out.println(password);
 
        // 7c4a8d09ca3762af61e59520943dc26494f8941b
        String dest = Hashing.sha1().hashBytes("123456".getBytes()).toString();
        System.out.println(dest);
    }
 
    public static String SHA1(String decript) throws NoSuchAlgorithmException {
        MessageDigest digest = java.security.MessageDigest
                .getInstance("SHA-1");
        digest.update(decript.getBytes());
        byte messageDigest[] = digest.digest();
 
        StringBuffer hexString = new StringBuffer();
 
        for (int i = 0; i < messageDigest.length; i++) {
            String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
            if (shaHex.length() < 2) {
                hexString.append(0);
            }
            hexString.append(shaHex);
        }
        return hexString.toString();
 
    }
}

7、启动zk客户端连接zookeeper,创建根节点

8、Java程序连接

<dependency>
     <groupId>com.dangdang</groupId>
     <artifactId>config-toolkit</artifactId>
     <version>3.1.6-RELEASE</version>
</dependency>
import com.dangdang.config.service.GeneralConfigGroup;
import com.dangdang.config.service.zookeeper.ZookeeperConfigGroup;
import com.dangdang.config.service.zookeeper.ZookeeperConfigProfile;
 
public class DandangMain {
    public static void main(String[] args) {
        ZookeeperConfigProfile configProfile = new ZookeeperConfigProfile("127.0.0.1:2181", "/PAYCENTER", "1.0.0");
        GeneralConfigGroup group = new ZookeeperConfigGroup(configProfile, "test1");
        System.out.println(group.get("password"));
    }
}

9、与spring集成

application.properties

##配置中心zk地址ַ
zk.address=192.168.40.223:2181
##配置中心
configToolkit.rootNode=/PAYCENTER
<!-- 连接zookeeper上的各节点 -->
<util:properties id="configToolkitProp" location="classpath:applicationContext.properties"></util:properties>
	
<bean id="configProfile" class="com.dangdang.config.service.zookeeper.ZookeeperConfigProfile">
   <constructor-arg name="connectStr" value="#{configToolkitProp['zk.address']}" />
   <constructor-arg name="rootNode" value="#{configToolkitProp['configToolkit.rootNode']}" />
   <constructor-arg name="version" value="1.0.0" />
</bean>

<!-- 自定义ZookeeperConfigGroup 加载到程序里 -->
<bean id="zookeeperHotConfigGroup" class="com.paycenter.backend.cfg.ZookeepConfig" c:configProfile-ref="configProfile" c:node="HOT_CONFIG" />
<bean id="zookeeperColdConfigGroup" class="com.dangdang.config.service.zookeeper.ZookeeperConfigGroup" c:configProfile-ref="configProfile" c:node="COLD_CONFIG" />

<!-- 将各节点的数据加载到spring里 -->
<bean id="zookeeperSources" class="com.dangdang.config.service.support.spring.ConfigGroupSourceFactory"
		  factory-method="create">
		<constructor-arg name="configGroups">
			<list>
				<ref local="zookeeperHotConfigGroup"/>
				<ref local="zookeeperColdConfigGroup"/>
			</list>
		</constructor-arg>
</bean>

<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
		<property name="order" value="1"/>
		<property name="ignoreUnresolvablePlaceholders" value="true"/>
		<property name="propertySources" ref="zookeeperSources"/>
</bean>

<!-- 程序中利用热配 -->
<bean id="hotConfig" class="com.paycenter.backend.cfg.HotConfig">
	<property name="zookeeperConfigGroup" ref="zookeeperHotConfigGroup"/>
</bean>
/**
 * @Title: 支持热更新的配置项,该配置项的数据来自config-toolkit。
 */
@SuppressWarnings("rawtypes")
public class HotConfig implements InitializingBean {
	/**
	 * zookeeper配置项
	 */
	private ZookeepConfig zookeeperConfigGroup;

	/**
	 * 时间任务
	 */
	private Timer timer;

	/**
	 * 配置对象的更新周期
	 */
	private long objCfgUpdatePeriod = 1000*60*60 ;

	public void setZookeeperConfig(ZookeepConfig zookeeperConfig) {
		this.zookeeperConfigGroup = zookeeperConfig;
	}

	public Map getZookeeperConfigGroup() {
		return zookeeperConfigGroup;
	}

	public void setZookeeperConfigGroup(ZookeepConfig zookeeperConfigGroup) {
		this.zookeeperConfigGroup = zookeeperConfigGroup;
	}
	
	public Object get(String key,Object def){
		Object ret=null;
		try {
			ret= this.zookeeperConfigGroup.get(key);
			if(ret==null){
				ret= def;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return ret;
	}
	/**
	 * 实时获取最新的参数配置
	 * @param key
	 * @return
	 */
	public Object get(String key) {
		return this.zookeeperConfigGroup.get(key);
	}

	public void put(String key,String value){
		zookeeperConfigGroup.update(key,value);
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		timer = new Timer();
	}
}
public class ZookeepConfig extends  ZookeeperConfigGroup{
    private ZookeeperConfigProfile configProfile;
    public ZookeepConfig(ConfigGroup internalConfigGroup, ZookeeperConfigProfile configProfile, String node) {
        super(internalConfigGroup, configProfile, node);
        this.configProfile=configProfile;
    }

    public ZookeepConfig(ZookeeperConfigProfile configProfile, String node) {
        super(configProfile, node);
        this.configProfile=configProfile;
    }

    public String getProperty(String key){
        String value=super.get(key);
        return value.trim();
    }

    public void update(String key,String value){
        try {
           // String nodeName="/"+configProfile.getRootNode()+"/"+configProfile.getVersion()+"/"+getNode()+"/"+key;
            String nodeName= configProfile.getRootNode()+"/"+configProfile.getVersion()+"/"+getNode()+"/"+key;
            Field field=this.getClass().getSuperclass().getDeclaredField("client");
            field.setAccessible(true);
            CuratorFramework client=(CuratorFramework)field.get(this);
            boolean suc = false;
            try {
                Stat stat = client.checkExists().forPath(nodeName);
                if (stat != null) {
                    Stat opResult = client.setData().forPath(nodeName, value.getBytes(Charsets.UTF_8));
                    suc = opResult != null;
                } else {
                    String opResult = client.create().creatingParentsIfNeeded().forPath(nodeName, value.getBytes(Charsets.UTF_8));
                    suc = Objects.equal(nodeName, opResult);
                }
            } catch (Exception e) {
                throw Throwables.propagate(e);
            }
        } catch (Exception e) {
            throw Throwables.propagate(e);
        }
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Config Toolkit 是大型集群和分布式应用配置工具包。Config toolkit 用于简化从本地配置文件到 zookeeper 的迁移。在大型集群和分布式应用中,配置不宜分散到集群结点中,应该集中管理.依赖JAVA 7 TOMCAT 7 for ConfigWeb模块Config Toolkit - 封装应用属性配置的获取及更新ConfigWeb - 提供web界面维护属性配置,提供配置导入导出功能Spring集成本地配置覆盖配置管理web界面版本控制,支持灰度发布支持为配置项添加注释Quick Startload properties from zookeeperZookeeperConfigProfile configProfile = new ZookeeperConfigProfile("zoo.host1:8181", "/projectx/modulex", "1.0.0");     GeneralConfigGroup propertyGroup1 = new ZookeeperConfigGroup(configProfile, "property-group1");load properties from classpath fileFileConfigProfile configProfile = new FileConfigProfile("UTF8", "properties");     ConfigGroup configGroup = new FileConfigGroup(configProfile, "classpath:property-group1.properties");load xml properties from classpath fileFileConfigProfile configProfile = new FileConfigProfile("UTF8", "xml");     ConfigGroup configGroup = new FileConfigGroup(configProfile, "classpath:property-group1.xml");load properties from fileFileConfigProfile configProfile = new FileConfigProfile("UTF8", "properties");     ConfigGroup configGroup = new FileConfigGroup(configProfile, "file:/Users/yuxuanwang/Work/git/config-toolkit/config-toolkit-demo/src/main/resources/property-group1.properties");load properties from httpFileConfigProfile configProfile = new FileConfigProfile("UTF8", "properties");     ConfigGroup configGroup = new FileConfigGroup(configProfile, "http://crnlmchina.github.io/config-group.properties"); 标签:Config

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值