开源全局配置中心XDiamond应用解析

原创 2017年09月05日 15:48:00




简介:

全局配置中心,存储应用的配置项,解决配置混乱分散的问题。名字来源于淘宝的开源项目diamond,前面加上一个字母X以示区别。

特性:

服务端:

配置文件支持artifactId内部不同环境的继承和artifactId直接的依赖;

支持groupId,artifactId,version,profile四个维度以应对复杂环境;

可以对指定环境设置secret key防止非法获取配置;

支持json格式批量添加key,value;

支持多环境部署;

客户端:

和spring集成,使用简单;

配置修改后实时获取更新;

对修改提供监听,修改后无需重启服务自动加载修改结果;

工作原理

每个项目有groupId,artifactId,version,然后在不同的环境里对应不同的profile,比如:test, dev, product。

应用在启动时,通过网络连接到xdiamond配置中心,获取到最新的配置。如果没有获取到,从本地备份读取最后拉取的配置。

在Spring初始化时,把配置转为Properties,应用可以通过${}表达式或者@Value来获取配置。

如果配置有更新,可以通过Listener来通知应用。

每个项目都有一个base的profile,所有的profile都会继承base的配置。在base可以放一些公共的配置,比如某个服务的端口。

对于使用者,xdiamond提供的是一个Properties对象。用户可以结合Spring等来使用。

安装配置

    从git获取源码,下载地址:https://github.com/hengyunabc/xdiamond.git

   

进入下载目录,修改各个目录下的pom.xml文件,去除无用引用,更改jar引用版本为自己使用版本,以免构建报错。

    在根目录执行mvn命令,加载需要的jar包。进入xdiamond-common,对程序进行打包。

进入xdiamond-server,修改web.xml配置文件,设置xdiamond-server的运行环境dev或product。修改config下application.dev.properties和application.product.properties,设置相应环境的数据库信息,注释掉xdiamond.initDatabase=true,以免服务重启的时候重建数据库导致之前设置的信息丢失。执行mvn命令,将xdiamond-server打包成war包。

在mysql客户端按顺序打开database下的schema-dev.sql和data-dev.sql并执行,创建系统运行所需的数据库表和初始化数据。

发布war包到web容器并重启。访问相应地址链接,点击Standard,默认用户名和密码都是admin。为了防止样式混乱,建议使用chrome浏览器访问。

       

服务端配置:

项目管理即为设置配置文件内容。支持依赖和继承。以常用数据库配置为例设置配置文件。

首先创建基本数据库配置项目group为mining,artifactId为jdbc,版本为0.0.1。

点击查看profile,进入profile设置。系统默认设置base,dev,product,test四个环境。Dev,product,test会自动继承base中的内容。

点击base的查看config,可以将所有环境都会用到的配置信息添加进去。

Dev,product,test可以根据自己的环境需要设置不同的配置:

从图上可以看到这三个环境自动继承了base设置的内容,并标明了来源。

基本数据库配置完成后使用数据库连接的每个工程可以直接引用数据库连接配置,以miningmonitor配置为例。在创建project完成后点击查看Dependency,点击添加依赖,设置依赖关系。

添加依赖关系后,在查看config中可以看到依赖的设置:

依赖关系多了以后可以在依赖图中查看项目的依赖关系:

客户端配置:

服务端配置好后,应用程序需要引入客户端Jar包来读取。

在pom.xml中添加如下引用:

<dependency>
    		<groupId>org.apache.curator</groupId>
    		<artifactId>curator-framework</artifactId>
    		<version>2.4.2</version>
		</dependency>
		<dependency>
    		<groupId>org.apache.curator</groupId>
    		<artifactId>curator-recipes</artifactId>
    		<version>2.4.2</version>
		</dependency>
		
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.1.39</version>
		</dependency>

		<dependency>
			<groupId>io.netty</groupId>
			<artifactId>netty-transport</artifactId>
			<version>4.0.24.Final</version>
		</dependency>
		<dependency>
			<groupId>io.netty</groupId>
			<artifactId>netty-codec</artifactId>
			<version>4.0.24.Final</version>
		</dependency>

将xdiamond-client进行打包,引入系统中。在spring配置文件中添加配置:

<bean id="xDiamondConfig" class="io.github.xdiamond.client.XDiamondConfig"
		init-method="init">
		<property name="serverHost" value="${xdiamond.server.host:localhost}" />
		<property name="serverPort" value="5678" />
		<property name="groupId" value="mining.test.dev" />
		<property name="artifactId" value="mining.test" />
		<property name="version" value="0.0.1" />
		<property name="profile" value="${xdiamond.project.profile:test}" />
	</bean>
<bean id="xDiamondProperties"
	 class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
		<property name="targetObject" ref="xDiamondConfig" />
		<property name="targetMethod" value="getProperties" />
	</bean>
<bean id="xDiamondProperties2" class="java.util.Properties"factory-bean="xDiamondConfig" factory-method="getProperties"></bean>

注入xDiamondProperties2或者xDiamondProperties使用配置文件中的内容。
在配置文件中做如下配置,可以在配置文件中使用${}来获取配置文件中的内容:

<bean id="xDiamondConfig"
		class="io.github.xdiamond.client.spring.XDiamondConfigFactoryBean">
		<property name="serverHost" value="${xdiamond.server.host:localhost}" />
		<property name="serverPort" value="5678" />
		<property name="groupId" value="mining.test.dev" />
		<property name="artifactId" value="mining.test" />
		<property name="version" value="0.0.1" />
		<property name="profile" value="${xdiamond.project.profile:test}" />
		<property name="locations" value="classpath:property-placeholder.properties"></property>
	</bean> 

	<bean
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="properties">
			<bean id="xDiamondProperties" class="java.util.Properties"
				factory-bean="xDiamondConfig" factory-method="getProperties">
			</bean>
		</property>
	</bean>
<bean id="testBean" class="io.github.xdiamond.client.net.test.TestBean">
		<property name="name" value="${testBean.name}"></property>
	</bean>

以上是客户端测试和example给出的配置,配置可以满足应用,但是缺陷也很明显:
Ø 服务端的一个项目需要添加一个Bean;
Ø  serverHost和serverPort重复配置;
针对以上情况,对客户端程序进行改造,客户端添加如下程序:


MiningDiamondConfig替代xDiamondConfig从list中获取MiningConfig(服务端项目信息)信息,循环从服务端获取配置内容;
MiningDiamondConfigFactoryBean替代XDiamondConfigFactoryBean,支持从配置文件获取服务端项目信息,一次获取多个项目的配置信息;
修改后最终改为如下配置:

<bean id="xDiamondConfig"
		class="io.github.xdiamond.client.mining.MiningDiamondConfigFactoryBean">
		<property name="serverHost" value="${xdiamond.server.host:192.168.11.112}" />
		<property name="serverPort" value="5678" />
		<property name="locations" >
			<list>
                <value>classpath:property-placeholder.properties</value>
                <value>classpath:configlist.properties</value>
            </list>
		</property>
	</bean>

Configlist.properties的内容如下:


xDiamond客户端设计了对获取的整个内容或者指定某个内容进行监听。MiningAnnotationListenerAbastract抽象类提供了监听的具体实现。应用时只需要继承该抽象类,实现抽象方法即可。
注意:继承抽象类的子类不能实现BeanFactoryPostProcessor接口,否则功能不执行。API中解释的原因是:A BeanFactoryPostProcessor may interact with and modify beandefinitions, but never bean instances.(BeanFactoryPostProcessor可以与bean定义进行交互和修改,但不能与bean实例进行交互。)可以参考文章:http://blog.csdn.net/wufaliang003/article/details/77839436




版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

开源全局配置中心XDiamond

项目地址: https://github.com/hengyunabc/xdiamond简介全局配置中心,存储应用的配置项,解决配置混乱分散的问题。名字来源于淘宝的开源项目diamond,前面加上一个...

深入解析淘宝Diamond之客户端架构

说明:本文不介绍如何使用Diamond,只介绍Diamond的实现原理 一、什么是Diamond diamond是淘宝内部使用的一个管理持久配置的系统,它的特点是简单、可靠、易用,目前淘宝内部绝大...

配置持久化框架diamond简介及高阶应用

配置持久化框架diamond 前言 一、简介 二、特点 三、应用场景 四、server搭建 五、发布配置数据 六、简单应用 七、高级应用 八、与spring动态集成 结束语     前言   配置...

开源配置中心之Apollo

(阿波罗)是携程框架部门研发的配置管理平台,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。服务端基于Spring Boot和Sprin...
  • lePdou
  • lePdou
  • 2017年04月27日 21:55
  • 2752

配置管理系统浅析

我们的程序常常有一些配置信息,例如连接的数据库配置、缓存大小、线程数等等。这些配置信息的管理一般有两种方式: a. 配置信息放到文件中,程序启动时导入,或者在程序运行过程中监控文件的修改重新导入配置...
  • yfkiss
  • yfkiss
  • 2013年06月13日 21:42
  • 11331

淘宝分布式配置管理服务Diamond

在一个分布式环境中,同类型的服务往往会部署很多实例。这些实例使用了一些配置,为了更好地维护这些配置就产生了配置管理服务。通过这个服务可以轻松地管理这些应用服务的配置问题。应用场景可概括为: zo...

持久化配置管理 diamond 使用简介

本次为大家介绍diamond的概况和快速使用。 一、概况diamond是淘宝内部使用的一个管理持久配置的系统,它的特点是简单、可靠、易用,目前淘宝内部绝大多数系统的配置,由diamond来进行统一管理...

TDDL+DIAMOND的配置及使用(四):TDDL整合spring

TDDL与spring的整合比较简单,只要tddl接管spring的数据源datasource即可            (1)添加依赖 com.taobao.tddl tdd...

淘宝动态配置diamond-server 源码讲解

1.diamond-server工程里 使用了我们常用的一些技术 比如spring springmvc jsbctamplate 等等这些技术    jar包如下                 ...

阿里中间件——diamond

一、前言        最近工作不忙闲来无事,仔细分析了公司整个项目架构,发现用到了很多阿里巴巴集团开源的框架,今天要介绍的是中间件diamond,访问了对应开发团队的博客(http://jm-blo...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:开源全局配置中心XDiamond应用解析
举报原因:
原因补充:

(最多只允许输入30个字)