基于ZK构建统一配置中心的方案和实践

基于ZK构建统一配置中心的方案和实践

背景:

基于ZK构建统一配置中心的方案和实践

近期使用Zk实现了一个简单的配置管理的小东西,在此开源出来,有兴趣的希望提出您的宝贵意见。如果恰巧您也使用或者接触过类似的东西,

也希望您可以分享下您觉得现在这个项目可以优化和改进的地方。

 

项目地址:

https://github.com/cncduLee/zk-ucc

 

需求:

1、不需要重启应用、修改代码就可以对业务做开关操作

2、避免不必要的重复拉取配置信息,降低网络IO,节省服务器资源。

例如1:开发一个评论系统,违禁词这个东西,应该是可配置的,同时又是变动极少的。如何设计这个违禁词模块呢?

在比如2:开发一个cms系统,你的内容和后台可配置后,是不是每次都去库里面,或者说是你的存储你面查询呢?可不可以缓存在你的应用服务器上面,有改变的时候再去查呢?

 

下面是对基于ZK(为什么是基于zk)的统一配置中心的设计方案:

1、  首先回答为什么是zk

为什么是基于zk,而不是mq呢?mq也可以达到变更后通知的效果啊。1、zk被广泛应用与各大开源项目(hadoop,pig,hiv,hbase……)所有,稳定,且经过长期测试,各种故障排查,错误恢复的方案很完善。2、zk节点自带一定存储。可以满足体量比较小的配置信息。

 

2、  方案概要:

  

简要说明:配置放在应用服务器上面,配置信息有变更的时候再去配置存储中查询配置信息,然后再次缓存到应用服务器

  

ucc-zookeeper:

基于zookeeper的统一配置中心实现

项目说明

由agent和console组成

agent:作为基础jar包,被接入程序使用
console:后台运营、管理、配置的地方

如何使用统一配置呢?

1、Annotaion 这无疑是最简洁、优雅的方式
2、控制台配置
3、java代码

项目如何接入统一配置?

主要通过三种方式:这三种都需要添加相关的mvn依赖(jar包), 然后就可以在你的项目使用Annotation了

1、spring接入
2、修改启动脚本
3、在控制台配置相关信息

spring接入说明:

第一步
添加mvn依赖:

<dependency>
    <groupId>com.jdpay.ucc</groupId>
    <artifactId>ucc-spring</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
第二步
配置xml方式:

        <!--annotation扫描-->
        <context:component-scan base-package="com.jdpay.ucc.spring.usage" />
        <context:annotation-config/>

        <!--声明支持扩展的annotation配置-->
        <bean class="com.jdpay.ucc.spring.ConfigAnnotationBeanPostProcessor">
            <constructor-arg index="0" value="${zk.servers}"/>
            <constructor-arg index="1" value="${zk.forceWhenNull}"/>
        </bean>
第三步
spring接入实例   

@Service("kw")
@ZkTypeConfigurable(useOwnServer = false,path = "/conf/test/demo")
public class KeyWord implements Config {
    @ZkExtendConfigurable(path = "keyWords",update = true,tempKey = "key_words",dataStroe = CacheDataStore.class)
    public static Map<String,String> config = new HashMap<String, String>(0);

    @Override
    public void print() {
        System.out.println(config);
    }
}

agent接入说明:

提供三种接入方式

方式一:

控制台配置方案,客户端自动加载。

方式二:

通过agent的方式:

1、配置注解:

@ZkTypeConfigurable(servers = "localhost:2181",useOwnServer = true,path = "/conf/test/demo")
public class Requirements {
    @ZkFieldConfigurable(path = "name",update = true)
    public static String name = "default_name";

    @ZkFieldConfigurable(path = "cpu",update = true,resolver = CpuResolver.class)
    public static Cpu cpu = new Cpu("default","default","default");
}

2、修改jvm启动参数加上:

-javaagent:cuc-agent-1.0-SNAPSHOT.jar 
方式三:

除以上的启动但是外,还支持一下两种agent方式:

1、启动参数

-javaagent:agent.jar=zk@localhost:2181#class@com.jdpay.ucc.Demo

2、jvm环境变量

-javaagent:agent.jar -DZK=localhost:2181 -DCLASS=c1,c2,c3

扩展配置接入说明

1、定义扩展配置存储方案

实现ExtendDataStore接口即可。例如:

public class CacheDataStore implements ExtendDataStore<Map<String,String>> {
    public final static Map<String,Map<String,String>> _CACHE = new HashMap<String, Map<String,String>>(10);
    static {
        //init value
        Map<String,String> map = new HashMap<String, String>(4);
        map.put("d1","d1");
        map.put("d2","d2");
        map.put("d3","d3");
        map.put("d4","d4");
        _CACHE.put("key_words",map);

        Map<String,String> map1 = new HashMap<String, String>(4);
        map1.put("a1","a1");
        map1.put("a2","a2");
        map1.put("a3","a3");
        map1.put("a4","a4");
        _CACHE.put("key_words1",map1);

        Map<String,String> map2= new HashMap<String, String>(4);
        map2.put("咚咚1","咚咚1");
        map2.put("咚咚2","咚咚2");
        map2.put("咚咚3","咚咚3");
        map2.put("咚咚4","咚咚4");
        _CACHE.put("key_words2",map2);
    }

    @Override
    public void setValue(String key, Map<String, String> map) {
        _CACHE.put(key,map);
    }

    @Override
    public Map<String, String> getValue(String key) {
        return _CACHE.get(key);
    }
}

说明:Map<String,String>为扩展配置字段的类型

2、对扩展配置的字段注解

@ZkTypeConfigurable(useOwnServer = false,path = "/conf/test/demo")
public class KeyWord {
    @ZkExtendConfigurable(path = "keyWords",update = true,tempKey = "key_words",dataStroe = CacheDataStore.class)
    public static Map<String,String> config = new HashMap<String, String>(0);

}

console配置使用说明:

zk节点管理

1、更新,删除节点

DataV logo

2、创建新节点

DataV logo

配置任务管理
TODO

TO LIST

一、配置管理

    1、配置管理console部分的开发
    2、配置管理的agent部分开发

二、使用doc完善

三、流程管理,项目管理

四、细节调优

无、异常方案

 

1
0
« 上一篇: kafka(logstash) + elasticsearch 构建日志分析处理系统
» 下一篇: 基于Lease分布式系统重试服务选举
posted @  2015-04-11 11:15  百墨 阅读( 680) 评论( 2编辑  收藏

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值