XXL-CONF 是一个轻量级分布式配置管理平台,拥有"轻量级、秒级动态推送、多环境、跨语言、跨机房、配置监听、权限控制、版本回滚"等特性。现已开放源代码,开箱即用。html
于2015年,我在github上建立XXL-CONF项目仓库并提交第一个commit,随之进行系统结构设计,UI选型,交互设计……java
至今,XXL-CONF已接入多家公司的线上产品线,接入场景如电商业务,O2O业务和核心中间件配置动态化等,截止2018-10-24为止,XXL-CONF已接入的公司包括不限于:mysql
- 一、深圳市绽开工场科技有限公司
- 二、深圳双猴科技有限公司
- 三、商智神州软件有限公司
- 四、浙江力太科技
- ……
更多接入的公司,欢迎在 登记地址 登记,登记仅仅为了产品推广。git
欢迎你们的关注和使用,XXL-CONF也将拥抱变化,持续发展。github
why not propertiesredis
常规项目开发过程当中, 一般会将配置信息位于在项目resource目录下的properties文件文件中, 配置信息一般包括有: jdbc地址配置、redis地址配置、活动开关、阈值配置、黑白名单……等等。使用properties维护配置信息将会致使如下几个问题:spring
why XXL-CONFsql
源码仓库地址 | Release Download |
---|---|
https://github.com/xuxueli/xxl-conf | Download |
http://gitee.com/xuxueli0323/xxl-conf | Download |
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-conf-core</artifactId>
<version>{最新稳定版}</version>
</dependency>
请下载项目源码并解压,获取 "数据库初始化SQL脚本(Mysql)" 并执行便可。脚本位置以下:docker
xxl-conf/doc/db/xxl-conf.sql
解压源码,按照maven格式将源码导入IDE, 使用maven进行编译便可,源码结构以下图所示:数据库
- xxl-conf-admin:配置中心
- xxl-conf-core:公共依赖
- xxl-conf-samples: 接入XXl-CONF的示例项目,供用户参考学习
- xxl-conf-sample-frameless: 无框架版本,main方法直接启动运行
- xxl-conf-sample-spring: spring版本
- xxl-conf-sample-springboot: springboot版本
- xxl-conf-sample-jfinal: jfinal版本
- xxl-conf-sample-nutz: nutz版本
项目:xxl-conf-admin
做用:提供一个完善强大的配置管理平台,包含:环境管理、用户管理、项目管理、配置管理等功能,所有操做经过Web界面在线完成;
/xxl-conf/xxl-conf-admin/src/main/resources/application.properties
# 配置中心数据库配置,存储配置元数据
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-conf?Unicode=true&characterEncoding=UTF-8
# 配置中心配置数据磁盘路径地址,务必对该路径存在读写权限
xxl.conf.confdata.filepath=/data/applogs/xxl-conf/confdata
# 配置中心接入验证TOKEN,选填,非空时启用,进行安全严重
xxl.conf.access.token=
项目编译打包后,可直接经过命令行启动;
// 方式1:使用默认配置,mysql默认为本地地址;
java -jar xxl-conf-admin.jar
// 方式2:支持自定义 mysql 地址;
java -jar xxl-conf-admin.jar --spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-conf?Unicode=true&characterEncoding=UTF-8
// Docker地址:https://hub.docker.com/r/xuxueli/xxl-conf-admin/
docker pull xuxueli/xxl-conf-admin
docker run -p 8080:8080 -v /tmp:/data/applogs --name xxl-conf-admin -d xuxueli/xxl-conf-admin
/**
* 如需自定义 mysql 等配置,可经过 "PARAMS" 指定,参数格式 RAMS="--key=value --key2=value2" ;
* 配置项参考文件:/xxl-conf/xxl-conf-admin/src/main/resources/application.properties
*/
docker run -e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl-conf?Unicode=true&characterEncoding=UTF-8 " -p 8080:8080 -v /tmp:/data/applogs --name xxl-conf-admin -d xuxueli/xxl-conf-admin
配置中心支持集群部署,提升配置中心负载能力和可用性。
配置中心集群部署时,项目配置文件保持一致便可。
项目:xxl-conf-sample-springboot
做用:接入XXl-CONF的示例项目,供用户参考学习。这里以 springboot 版本进行介绍,其余版本可参考各自sample项目。
<!-- xxl-conf-client -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-conf-core</artifactId>
<version>{最新稳定版}</version>
</dependency>
可参考配置文件:
/xxl-conf/xxl-conf-samples/xxl-conf-sample-springboot/src/main/resources/application.properties
配置项说明
# 配置中心跟地址,必填;
xxl.conf.admin.address=http://localhost:8080/xxl-conf-admin
# 环境配置,必填;如"test、ppe、product"等,指定配置加载环境;
xxl.conf.env=test
# 配置中心接入验证TOKEN,选填,非空时启用,进行安全严重
xxl.conf.access.token=
# 配置快照文件地址,必填;会周期性缓存到本地快照文件中,当从配置中心获取配置失败时,将会使用使用本地快照文件中的配置数据;提升系统可用性;
xxl.conf.mirrorfile=/data/applogs/xxl-conf/xxl-conf-mirror-sample.properties
可参考配置文件:
/xxl-conf/xxl-conf-samples/xxl-conf-sample-springboot/src/main/java/com/xxl/conf/sample/config/XxlConfConfig.java
配置项说明
@Bean
public XxlConfFactory xxlConfFactory() {
XxlConfFactory xxlConf = new XxlConfFactory();
xxlConf.setAdminAddress(adminAddress);
xxlConf.setEnv(env);
xxlConf.setAccessToken(accessToken);
xxlConf.setMirrorfile(mirrorfile);
logger.info(">>>>>>>>>>> xxl-conf config init.");
return xxlConf;
}
至此,配置完成。
参考章节 "4.2 配置管理" 添加或更新配置信息;
参考章节 "3、客户端配置获取" 获取配置并接受动态推送更新;
XXL-CONF 提供多种配置方式,包括 "API、 @XxlConf、XML" 等多种配置方式,介绍以下。
可参考项目 "xxl-conf-sample-spring"(接入XXl-CONF的示例项目,供用户参考学习),代码位置:com.xxl.conf.sample.controller.IndexController.index()
参考 "IndexController" 代码以下:
String paramByApi = XxlConfClient.get("default.key01", null);
参考 "DemoConf.paramByAnno" 属性配置;示例代码
@XxlConf("default.key02")
public String paramByAnno;
“@XxlConf”注解属性 | 说明 |
---|---|
value | 配置Key |
defaultValue | 配置为空时的默认值 |
callback | 配置更新时,是否须要同步刷新配置 |
参考 "applicationcontext-xxl-conf.xml" 中 "DemoConf.paramByXml" 属性配置;示例代码以下:
<bean id="demoConf" class="com.xxl.conf.sample.demo.DemoConf">
<property name="paramByXml" value="$XxlConf{default.key03}" />
</bean>
参考以下代码:
<bean id="demoConf" class="com.xxl.conf.sample.demo.DemoConf2">
<constructor-arg index="0" value="#{T(com.xxl.conf.core.XxlConfClient).get('key')}" />
<property name="paramByXml" value="#{T(com.xxl.conf.core.XxlConfClient).get('default.key03')}" />
</bean>
可开发Listener逻辑,监听配置变动事件;可据此实现动态刷新JDBC链接池等高级功能;
参考 "IndexController" 代码以下:
XxlConfClient.addListener("default.key01", new XxlConfListener(){
@Override
public void onChange(String key, String value) throws Exception {
logger.info("配置变动事件通知:{}={}", key, value);
}
});
进入 "环境管理" 界面,可自定义和管理环境信息。
单个配置中心集群,支持自定义多套环境,管理多个环境的的配置数据;环境之间相互隔离;
新增环境:点击 "新增环境" 按钮可添加新的环境配置,环境属性说明以下:
- Env:每一个环境拥有一个维护的Env,做为环境标识;
- 环境名称:该环境的名称;
环境切换:配置中心顶部菜单展现当前操做的配置中心环境,可经过该菜单切换不一样配置中心环境,从而管理不一样环境中的配置数据;
进入 "用户管理" 界面,可查看配置中心中全部用户信息。
新增用户:点击 "新增用户" 按钮,可添加新用户,用户属性说明以下:
- 权限:
- 管理员:拥有配置中心全部权限,包括:用户管理、环境管理、项目管理、配置管理等;
- 普通用户:仅容许操做本身拥有权限的项目下的配置;
- 用户名:配置中心登录帐号
- 密码:配置中心登录密码
系统默认提供了一个管理员用户和一个普通用户。
分配项目权限:选中普通用户,点击右侧 "分配项目权限" 按钮,可为用户分配项目权限,权限细粒度到 "环境 + 项目"。 拥有环境项目权限后,该用户能够查看和操做该环境项目下所有配置数据。
修改用户密码:配置中心右上角下拉框,点击 "修改密码" 按钮,可修改当前登陆用户的登陆密码 (除此以外,管理员用户,可经过编辑用户信息功能来修改其余用户的登陆密码);
系统以 "项目" 为维度进行权限控制,以及配置隔离。可进入 "配置管理界面" 操做和维护项目,项目属性说明以下:
- AppName:每一个项目拥有惟一的AppName,做为项目标识,同时做为该项目下配置的统一前缀;
- 项目名称:该项目的名称;
系统默认提供了一个示例项目。
进入"配置管理" 界面, 选择项目,而后可查看和操做该项目下配置数据。
新增配置:点击 "新增配置" 按钮可添加配置数据,配置属性说明以下:
- KEY:配置的KEY,建立时将会自动添加所属项目的APPName所谓前缀,生成最终的Key。可经过客户端使用最终的Key获取配置;
- 描述:该配置的描述信息;
- VALUE:配置的值;
至此, 一条配置信息已经添加完成;
经过客户端能够获取该配置, 而且支持动态推送更新。
历史版本回滚:配置存在历史变动操做时,点击右侧的 "变动历史" 按钮,可查看该配置的历史变动记录。 包括操做时间、操做人,设置的配置值等历史数据,所以能够根据历史数据,从新编辑配置并回滚到历史版本;
配置中心由如下几个核心部分组成:
客户端基于多层设计,核心四层设计以下:
得益于客户端的多层设计,以及 LocalCache 和 Mirror-File 等特性,所以业务方能够在高QPS、高并发场景下使用XXL-CONF的客户端, 没必要担忧并发压力或配置中心宕机致使系统问题。
Java语言应用,能够直接经过依赖提供的Client包的方式,方便快速的接入和使用配置中心;可参考章节 "2、快速入门":
非Java语言,可借助 XXL-CONF 提供的 "配置中心http服务",获取配置、实时感知配置更新,从而实现多语言支持。
配置中心提供的 "配置中心http服务" 只会读磁盘配置数据,所以性能极高,并且配置中心支持经过集群无线横向扩展;
"配置中心http服务" 接口文档以下:
说明:查询配置数据;
------
地址格式:{配置中心跟地址}/find
请求参数说明:
一、accessToken:请求令牌;
二、env:环境标识
三、keys:配置Key列表
请求数据格式以下,放置在 RequestBody 中,JSON格式:
{
"accessToken" : "xx",
"env" : "xx",
"keys" : [
"key01",
"key02"
]
}
// 响应数据格式:
{
"code": 200, // 200 表示正常、其余失败
"msg": null, // 错误提示消息
"data": { // 配置信息,KV格式
"key01": "22",
"key02": "111"
}
}
说明:long-polling 接口,主动阻塞一段时间(默认30s);直至阻塞超时或配置信息变更时响应;
------
地址格式:{配置中心跟地址}/find
请求参数说明:
一、accessToken:请求令牌;
二、env:环境标识
三、keys:配置Key列表
请求数据格式以下,放置在 RequestBody 中,JSON格式:
{
"accessToken" : "xx",
"env" : "xx",
"keys" : [
"key01",
"key02"
]
}
响应数据格式:
{
"code": 501, // 200 表示正常,一直阻塞到结束,说明配置数据没变更;501 表示配置数据有变化;其余标示请求失败
"msg": "Monitor key update." // 错误提示消息
}
接入方能够借助上面两个接口,获取配置、实时感知配置更新;
客户端从配置中心获取到的配置数据后,会周期性缓存到本地快照文件中,当从配置中心获取配置失败时,将会使用使用本地快照文件中的配置数据;提升系统可用性;
单个配置中心集群,支持自定义多套环境,管理多个环境的的配置数据;环境之间相互隔离;
此处给出一些多环境配置的建议:
在配置所属对象存在代理(JDK、CGLib)的特殊状况下,推荐使用如下方式获取配置:(非代理状况下,能够忽略本章节)
XXL-CONF拥有极高的容灾性,首先配置数据进行多级存储, 可分为如下几层:
鉴于以上基础,在配置服务故障时,能够快速进行配置服务降级与恢复:
得益于配置中心集群关系对等特性,集群各节点提供幂等的配置服务;所以,异地跨机房部署时,只须要请求本机房配置中心便可,实现异地多活;
举个例子:好比机房A、B 内分别部署配置中心集群节点。即机房A部署 a一、a2 两个配置中心服务节点,机房B部署 b一、b2 两个配置中心服务节点;
那么各机房内应用只须要请求本机房内部署的配置中心节点便可,不须要跨机房调用。即机房A内业务应用请求 a一、a2 获取配置、机房B内业务应用 b一、b2 获取配置。
这种跨机房部署方式实现了配置服务的 "异地多活",拥有如下几点好处:
欢迎参与项目贡献!好比提交PR修一个bug,或者新建 Issue 讨论新特性或者变动。
更多接入的公司,欢迎在 登记地址 登记,登记仅仅为了产品推广。
产品开源免费,而且将持续提供免费的社区技术支持。我的或企业内部可自由的接入和使用。
不管捐赠金额多少都足够表达您这份心意,很是感谢 :) 前往捐赠