`
yettie
  • 浏览: 195600 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

zookeeper 配置中心——利用ZkConfig实现分布式配置文件实时同步

阅读更多

ZkConfig使用说明

源码:github: https://github.com/QuanZhong/ZKConfig

 

<!--[if !supportLists]-->一、<!--[endif]-->简介

ZkConfig是为zookeeper开发的配置服务工具包,能与现有的Java系统进行良好的集成,也可以使用与非java系统以独立进程运行。提供与spring进行集成的插件。采用注解方式对需要动态更新的内存数据对象进行标注。

ZkConfig用于解决在系统集群中配置文件的实时同步。当任意一台服务器配置文件发生变化的时候,所有集群服务器配置文件实现同步更新,并且在不启动web容器的情况下,实现内存配置对象的实时更新。

目前支持所有种类配置文件的同步更新,仅支持扩展名为.properties.cfg结尾的健值对文件格式的内存数据对象实时同步。其余配置文件仅支持磁盘数据同步。

<!--[if !supportLists]-->二、<!--[endif]-->使用说明

使用步骤:

<!--[if !supportLists]-->1、<!--[endif]-->增加虚拟机启动参数配置

运行zkconfig需要增加虚拟机运行参数 app.instance.config 的配置。app.instance.config 值为配置文件目录,将zkconfig.properties文件置于该目录下。

<!--[if !supportLists]-->2、<!--[endif]-->为需要动态更新的配置类对象增加@ZkValue注解

例:

//@ZkConfig(hosts = "127.0.0.1:2181")

public class TestObj {

 

@ZkValue(key = "ip")

private String ip;

@ZkValue(key = "port")

private int port;

private String sth;

 

//getter,setter

}

@ZkValue注解中key值为配置properties文件中的key值,仅仅有此注解的属性会被实时更新。

@ZkConfig注解与配置对象上,非必须,这里配置zookeeper服务器连接信息,此配置可以配置与zkconfig.properties文件中。

<!--[if !supportLists]-->3、<!--[endif]-->配置zkconfig.properties文件

zkconfig.properties文件复制到虚拟机运行参数 app.instance.config 所配置的目录下。

hosts=127.0.0.1:2181

Zookeeper集群连接字符串,以逗号分隔eg:127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183

sessionTimeout=5000

会话超时时间

app_name=cs

当前系统的应用名称,此项必填用于区分不同系统的配置文件

app_config_paths=${app.instance.config}

需要同步的系统配置文件目录集合,以逗号分隔eg:/data/config/v-crm,/data/config/v-cs

dir_watch_period=3000

文件目录监控频率单位毫秒,用于监控配置文件的变化

<!--[if !supportLists]-->4、<!--[endif]-->ZkConfig注册内存配置对象实例(这里注册是实例,不是类型)

//创建注册中心

BeanRegisterCenter brc = new BeanRegisterCenter();

//注册实例,有多个就注册多个

brc.register(new TestObj());

此步骤非必须,如果不想更新内存数据,此步骤与步骤2都可以忽略。

<!--[if !supportLists]-->5、<!--[endif]-->启动数据监听

//2、执行监听

MonitorType type = MonitorFactory.MonitorType.CONF_PROPERTIES_FILE_MONITOR;

ZkConfigExecutor.execute(type);

MonitorType 为监听类型枚举,目前支持通用文件类型监听以及Properties配置文件监听,后续可二次扩展。

示范代码(方式1):

/**

* run local example

* @param args

*/

public static void main(String[] args) {

CountDownLatch connectedSignal = new CountDownLatch(1);

try {

//1、注册配置所需配置类

BeanRegisterCenter brc = new BeanRegisterCenter();//执行监听

brc.register(new TestObj());

//2、执行监听

MonitorType type = MonitorFactory.MonitorType.CONF_PROPERTIES_FILE_MONITOR;

ZkConfigExecutor.execute(type);

 

connectedSignal.await();

} catch (Exception e) {

e.printStackTrace();

}

}

也可以采用方式二运行

 

public static void main(String[] args) throws IOException, InterruptedException, KeeperException {

List<Object> confInstances = new ArrayList<Object>();

confInstances.add(new TestObj());

ZkConfigScannerConfigurer zk = new ZkConfigScannerConfigurer();

zk.setMonitorType(2);

zk.setConfInstances(confInstances);

zk.startWatch();

 

 

}

 

<!--[if !supportLists]-->三、<!--[endif]-->与spring集成

spring.xml配置文件中加入如下配置即可实现集成:

<bean id="testConfig" class="com.lashou.cs.TestConfig"></bean>

<bean id="zkConfigScannerConfigurer" class="com.lashou.v.zkconfig.springplugin.ZkConfigScannerConfigurer" scope="singleton" lazy-init="false">

<property name="confInstanceNames"> 

<list>

<value>testConfig</value>

</list>

</property>

<property name="monitorType" value="2" />

</bean>

 

testConfig为内存数据同步对象。confInstanceNames为内存同步对象名称集合。monitorType为监听文件类型,1:通用文件类型;2properties文件类型。

 

<!--[if !supportLists]-->四、<!--[endif]-->注意事项

在于spring集成时候,内存配置对象尽量采用配置文件的方式,因spring在类实例化时候会优先实例化配置文件,其次是注解方式。如果延迟实例化可能会导致无法获取的内存配置对象实例。

<!--[if !supportLists]-->

五、<!--[endif]-->ZkConfig API说明

开源地址: https://github.com/QuanZhong/ZKConfig

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics