背景:

近期使用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、更新,删除节点

2、创建新节点

配置任务管理
TODO

TO LIST

一、配置管理

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

二、使用doc完善

三、流程管理,项目管理

四、细节调优

无、异常方案

基于ZK构建统一配置中心的方案和实践的更多相关文章

  1. .NET Core微服务之基于Apollo实现统一配置中心

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.关于统一配置中心与Apollo 在微服务架构环境中,项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改 ...

  2. Zookeeper笔记之基于zk的分布式配置中心

    一.场景 & 需求 集群上有很多个节点运行同一个任务,这个任务会有一些可能经常改变的配置参数,要求是当配置参数改变之后能够很快地同步到每个节点上,如果将这些配置参数放在本地文件中则每次都要修改 ...

  3. 基于zookeeper实现分布式配置中心(二)

    上一篇(基于zookeeper实现分布式配置中心(一))讲述了zookeeper相关概念和工作原理.接下来根据zookeeper的特性,简单实现一个分布式配置中心. 配置中心的优势 1.各环境配置集中 ...

  4. 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)

    基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)   前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...

  5. springcloud-spring cloud config统一配置中心

    统一配置中心 为什么需要统一配置中心? 统一配置中心顾名思义,就是将配置统一管理,配置统一管理的好处是在日后大规模集群部署服务应用时相同的服务配置一致,日后再修改配置只需要统一修改全部同步,不需要一个 ...

  6. SpringCloud系列之分布式配置中心极速入门与实践

    SpringCloud系列之分布式配置中心极速入门与实践 @ 目录 1.分布式配置中心简介 2.什么是SpringCloud Config? 3.例子实验环境准备 4.Config Server代码实 ...

  7. 基于Raft构建弹性伸缩的存储系统的一些实践

    基于Raft构建弹性伸缩的存储系统的一些实践 原创 2016-07-18 黄东旭 聊聊架构 最近几年来,越来越多的文章介绍了 Raft 或者 Paxos 这样的分布式一致性算法,但主要集中在算法细节和 ...

  8. 基于zookeeper实现分布式配置中心(一)

    最近在学习zookeeper,发现zk真的是一个优秀的中间件.在分布式环境下,可以高效解决数据管理问题.在学习的过程中,要深入zk的工作原理,并根据其特性做一些简单的分布式环境下数据管理工具.本文首先 ...

  9. 携程Apollo统一配置中心的搭建和使用

    原文链接:https://blog.csdn.net/luhong327/article/details/81453001 一.Apollo配置中心介绍 1.What is Apollo 1.1 Ap ...

随机推荐

  1. mysql的缓冲查询和非缓冲查询

    最近在开发一个PHP程序时遇到了下面的错误: PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted 错误信息显示允许的 ...

  2. 如何获取安卓系统自带应用的package和activity

    之前在做appium自动化测试的时候,参考网上的例子,运行安卓系统自带的app,所以,就需要获取系统自带的package(包名)和activity.这里简单记录一下,不一定适合所有的系统应用. 运行环 ...

  3. JAVA设计模式之1-单例模式

    设计模式是什么? 设计模式是一种思路,是在前辈们的软件工程中总结出来的套路,并且这些套路已经经过很多项目的测试,是比较成熟的思路,所以现在来总结一下常见的设计模式. 最简单最常用的就是单例模式: 一般 ...

  4. Django基础,Day1 - 环境安装与pycharm创建django项目

    Django是一个高级Python Web框架,支持快速部署,清理和实用的设计.它可以被轻易部署和提供实用的组件,而开发人员只需要专注于写自己的应用程序,而不需要重复造轮子.并且Django是自由和开 ...

  5. [LeetCode] Palindrome Partitioning 拆分回文串

    Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...

  6. mac 修改command+q 退出

    实在受不了! 在chrome中command+w 是关闭当前页面,command+q 退出浏览器: 经常查阅资料打开了N多个窗口,关闭时不小心将command+q当command+w按: so ... ...

  7. jquery 监听常用监听方法

    最近在做网站开发,需要用到不少js的知识.之前学过现在重新来看,发现还真忘了不少~~ 在使用基于bootstrap,或者基于 jquery 的插件时,如过没有出现预期效果 请最先检查下是否优先载入的 ...

  8. 协程--gevent模块(单线程高并发)

    先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行.这种 ...

  9. C/C++的基本数据类型

    数据类型决定数据的空间分配, 及能对其做什么操作. C语言中的四种基本数据类型: char,int,float,double. C与C++定义这些类型时都只是限定它们的最大最小值, 而不是它们的siz ...

  10. jquery和zepto的扩展方法extend

    jquery和zepto的扩展方法extend 总结下jQuery(3.1.1)和zepto(1.1.6)到底是如何来开放接口,使之可以进行扩展,两者都会有类型判断,本文使用简单的类型判断,暂不考虑兼 ...