Skip to content
clanspring edited this page May 16, 2016 · 3 revisions

分布配置工具包

在大型集群和分布式应用中,配置不宜分散到集群结点中,应该集中管理.


依赖

  • JAVA 6+
  • TOMCAT 7+ for ConfigWeb

模块

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

特性

  • 集中管理集群配置
  • 实现配置热更新
  • Spring集成
  • 本地配置覆盖
  • 配置管理web界面
  • 版本控制,支持灰度发布
  • 支持为配置项添加注释

RELEASE NOTES

https://github.com/dangdangdotcom/config-toolkit/wiki/release-notes

词典

  • ConfigFactory - 配置工厂,用于定义zookeeper地址及配置根目录
  • ConfigNode - 配置组,一组配置信息,对应于遗留系统中的properties属性文件

使用

maven依赖


    <dependency>
      <groupId>com.dangdang</groupId>
      <artifactId>config-toolkit-easyzk</artifactId>
      <version>2.0.3-RELEASE</version>
    </dependency>

直接使用

ConfigNode的概念是properties文件在Config Toolkit中的映射,ConfigNode负载加载指定配置组在zookeeper中的数据.

ConfigNode封装了zookeeper的事件,使zookeeper的数据变化对Config Toolkit的使用者透明化,从ConfigNode中获取的配置数据永远是最新的.

为了减弱Config Toolkit的侵入性,ConfigNode继承自Map<String,String>,使用者可以将ConfigNode以Map的形式注入到业务bean中.


    // 创建配置工厂指向zk的地址及配置在zk中的根地址,映射到zookeeper中的/projectx/modulex
	ConfigFactory configFactory = new ConfigFactory("zoo.host1:8181,zoo.host2:8181,zoo.host3:8181", "/projectx/modulex");
    // 从工厂中加载某配置组,映射到zookeeper中的/projectx/modulex/group0
	ConfigNode node = configFactory.getConfigNode("group0");
    // 从配置组中获取某配置,映射到zookeeper中的/projectx/modulex/group0/name
	Assert.assertNotNull(node.getProperty("name"));

Spring PlaceholderConfigurer集成

Spring的使用者一般使用PlaceHolder加载properties文件,Config Toolkit提供类ZookeeperSourceFactory来兼容Spring Placeholder.

需要注意的是,由于Spring Placeholder在bean的初始化阶段将配置信息注入到bean中,所以使用这种方式无法获取配置热更新的特性.

并不是所有的配置都有必要实现热更新,比如数据库的连接池,重新初始化的成本比较高;比较适合使用热更新的场景是一些需要在线调整的业务参数.


	<bean id="configFactory" class="com.dangdang.config.service.easyzk.ConfigFactory">
		<constructor-arg name="connectStr" value="zoo.host1:8181,zoo.host2:8181,zoo.host3:8181" />
		<constructor-arg name="rootNode" value="/projectx/modulex" />
	</bean>

	<bean id="zookeeperSources" class="com.dangdang.config.service.easyzk.support.spring.ZookeeperSourceFactory" factory-method="create">
		<constructor-arg name="configFactory" ref="configFactory" />
		<constructor-arg name="nodes">
			<list>
				<value>config-group1</value>
				<value>config-group2</value>
				<value>config-group3</value>
			</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>

Spring SPEL集成

由于ConfigNode是Map的实现类,在SPEL表达式的支持范围中,可以直接使用#{systemProperties.myProp}的格式在XML文件或@Value中将属性值注入到bean中.

SPEL同样无法获取热更新的特性.

旧util properties用法:


	<util:properties id="configToolkitCommon" location="classpath:config-toolkit.properties" />

Config-toolkit支持:


	<bean id="configToolkitCommon" class="com.dangdang.config.service.easyzk.ConfigNode" 
		factory-bean="configFactory" factory-method="getConfigNode">
		<constructor-arg name="node" value="config-toolkit" />
	</bean>

本地配置覆盖(一般用于调试集群中的单点)

本地配置覆盖一般用于调试集群中的单点,比如某个应用实例的某些配置需要不同于配置中心,如果检测到本地覆盖文件,那么就以本地覆盖文件的优先级更高.

默认情况下,Config Toolkit会在classpath下寻找local-override.xml文件.

本地覆盖文件的文件名可以通过设定环境变量来调整 -Dlocal-override.file=yourfile.xml

[例]:


	<?xml version="1.0" encoding="UTF-8"?>
	<node-factories xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xsi:schemaLocation="http://crnlmchina.github.io/local-override.xsd">
		<node-factory root="/projectx/modulex">
			<group id="property-group1">
				<node key="string_property_key">Welcome here.</node>
			</group>
		</node-factory>
	</node-factories>

以上的配置会在相应的应用中覆盖zookeeper节点/projectx/modulex/property-group1/string_property_key的值为Welcome here.

Config Web 管理界面

为避免误操作,避免开发人员获取线上配置的修改权限.

鉴权密码为节点的值,使用SHA1 HEX字符串加密,需要运维手动修改zookeeper数据创建应用根节点密码.

一般linux系统都带有python,可以使用python脚本方便生成:

##python脚本生成密码,参考以下命令

python -c "import hashlib;print hashlib.sha1('abc').hexdigest();"

# a9993e364706816aba3e25717850c26c9cd0d89d

##首次创建根节点及相应节点,参考下面两行命令

echo "create /aaa 1" |./zkCli.sh -server localhost:2181

echo "create /aaa/bbb 1" |./zkCli.sh -server localhost:2181

##对节点密码进行修改,参考以下命令

echo "set /aaa/bbb a9993e364706816aba3e25717850c26c9cd0d89d" |./zkCli.sh -server localhost:2181

Config Web Snapshot