Skip to content

基于Zookeeper分布式应用集中配置管理

· 5 min · linux / zookeeper

配置集中管理搭建#

分布式应用配置工具包config-toolkit 用于集群配置向 zookeeper的迁移

[TOC]

Introduction#

  • Zookeeper
  • Config Toolkit

Zookeeper#

zookeeper是为分布式应用设计的一个高性能协调服务,提供了如下的通用服务,如命名、配置管理、通过锁和分组服务,封装成简单易用的接口而无需开发人员从头编写代码。可以拿来即用,应用的领域有取得共识、分组管理、领导者选举和协议呈现。还可以按需自定义功能 官网介绍

Quick Start#

$ cd /usr
$ rz -by
$ tar -xvf zookeeper-3.4.10.tar.gz

单机模式#

  • 把解压目录下conf/zoo_sample.cfg复制一份在同目录下,重命名为zoo.cfg,dataDir属性可设置成别的
  • 执行解压目录下的bin/zkServer.sh start开启zookeeper
  • 执行解压目录下的bin/zkCli.sh -server 127.0.0.1<2181连接zookeeper>

ZooKeeper伪分布式集群安装#

伪分布式集群:在一台Server中,启动多个ZooKeeper的实例。上传并解压安装包

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.ZooDefs.Ids;
public class ZooKeeperClient {
public static void main(String[] args) throws Exception {
Watcher watcher = new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println(event.toString());
}
};
ZooKeeper zk = new ZooKeeper("xx.xx.xx.xx:2181", 3000, watcher);
System.out.println("====创建节点");
zk.create("/demoProject", "/demoModule".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("====查看节点是否安装成功");
System.out.println(new String(zk.getData("/demoProject", false, null)));
System.out.println("====修改节点的数据");
zk.setData("/demoProject", "test".getBytes(), -1);
System.out.println("====查看修改的节点是否成功");
System.out.println(new String(zk.getData("/demoProject", false, null)));
System.out.println("====删除节点");
zk.delete("/demoProject", -1);
System.out.println("====查看节点是否被删除");
System.out.println("节点状态:" + zk.exists("/demoProject", false));
zk.close();
}
}
运行结果:
====创建节点
WatchedEvent state:SyncConnected type:None path:null
====查看节点是否安装成功
demoModule
====修改节点的数据
====查看修改的节点是否成功
test
====删除节点
====查看节点是否被删除
节点状态:null

Config Toolkit#

Config Toolkit 是大型集群和分布式应用配置工具包。Config Toolkit 用于简化从本地配置文件到 Zookeeper 的迁移。在大型集群和分布式应用中,配置不宜分散到集群结点中,应该集中管理。

Module#

  • Config Toolkit : 封装应用属性配置的获取及更新
  • ConfigWeb: 提供web界面维护属性配置,提供配置导入导出功能

Features#

  • 集中管理集群配置
  • 实现配置热更新
  • 多配置源支持,内置支持zookeeper、本地文件、http协议
  • Spring集成
  • 本地配置覆盖
  • 配置管理web界面
  • 版本控制,支持灰度发布
  • 支持为配置项添加注释

Quick Start#

git clone https://github.com/dangdangdotcom/config-toolkit.git
cd config-toolkit/config-zk-web
mvn package

Make Use Spring SPEL#

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:config="https://crnlmchina.github.io/config"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-4.0.xsd
https://crnlmchina.github.io/config
https://crnlmchina.github.io/config/config.xsd">
<!--SpringUtil Web Configuration -->
<util:properties id="configToolkitConfigs" location="classpath*:config.properties"/>
<!--SPEL zookeeper 集成-->
<config:profile connect-str="#{configToolkitConfigs['zk.address']}" root-node="/demoProject/demoModule"
version="#{configToolkitConfigs['zk.configs.version']}"/>
<config:group id="demoPropertyGroup" node="demoProperty-group"/>
<!-- Your business bean Inject property with used spring style -->
<!--<bean class="">-->
<!--<property name="name" value="#{demoPropertyGroup['key']}" />-->
<!--</bean>-->

JavaCode#

ZookeeperConfigProfile configProfile = new ZookeeperConfigProfile("xx.xx.xx.xx:2181", "/demoProject/demoModule", "1.0.0");
GeneralConfigGroup group = new ZookeeperConfigGroup(configProfile, "demoPropertyGroup");
String stringProperty = group.get("test");
Preconditions.checkState("cool".equals(stringProperty));
@Resource
private ZookeeperConfigGroup configGroup;
System.out.println(configGroup.get("test"));