常规项目开发过程中, 通常会将配置信息位于在项目 resource 目录下的 properties 文件文件中, 配置信息通常包括有: jdbc 地址配置, redis 地址配置, 活动开关...... 等等. 因此每次上线或者服务迁移的时候都要手动修改配置, 并一台一台的重启服务器, 甚是麻烦, 且费时费力.
于是便萌生出了使用配置中心的想法, 在考察了 github 上的 apoll,xxl-conf 等开源项目后, 感觉都不适合我司的应用模型, 于是决定自研一套符合自己的配置中心, 因此 LightConf 便应运而生, 当然 LightConf 也借鉴了 apoll,xxl-conf 的部分代码实现.
项目开源地址
在经历了一个多月的开发后, 项目的第一个稳定版本终于完成, 开源地址 https://github.com/haifeiWu/lightconf , 欢迎各路大神 star, 拍砖.
LIGHTCONF 使用了 netty 实现底层通讯, 保证配置的实时生效. 接入 LIGHTCONF 事只需要添加 maven 依赖, 简单配置即可马上上手, 学习零成本.
一, 简介
1.1 概述
LIGHTCONF 是一个配置管理平台, 其核心设计目标是 "为业务提供统一的配置管理服务".
1.2 特性
1, 简单易用: 上手非常简单, 只需要引入 maven 依赖和一行配置即可;
2, 在线管理: 提供配置管理中心, 支持在线管理配置信息;
3, 实时推送: 配置信息更新后, 实时推送配置信息, 项目中配置数据会实时更新并生效, 不需要重启线上机器;
4, 配置备份: 配置数据会在 MySQL 中会对配置信息做备份, 保证配置数据的安全性;
1.3 背景
why not properties
常规项目开发过程中, 通常会将配置信息位于在项目 resource 目录下的 properties 文件文件中, 配置信息通常包括有: jdbc 地址配置, redis 地址配置, 活动开关, 阈值配置, 黑白名单...... 等等. 使用 properties 维护配置信息将会导致以下几个问题:
1, 需要手动修改 properties 文件;
2, 需要重新编译打包;
3, 需要重启线上服务器 (项目集群时, 更加令人崩溃) ;
4, 配置生效不及时: 因为流程复杂, 新的配置生效需要经历比较长的时间才可以生效;
5, 不同环境上线包不一致: 例如 JDBC 连接, 不同环境需要差异化配置;
why LIGHTCONF
1, 不需要 (手动修改 properties 文件) : 在配置管理中心提供的 web 界面中, 定位到指定配置项, 输入新的配置的值, 点击更新按钮即可;
2, 不需要 (重新编译打包) : 配置更新后, 实时推送新配置信息至项目中, 不需要编译打包;
3, 不需要 (重启线上服务器) : 配置更新后, 实时推送新配置信息至项目中, 实时生效, 不需要重启线上机器;
4, 配置生效 "非常及时" : 点击更新按钮, 新的配置信息将会即可推送到项目中, 瞬间生效, 非常及时. 比如一些开关类型的配置, 配置变更后, 将会立刻推送至项目中并生效, 相对常规配置修改繁琐的流程, 及时性可谓天壤之别;
5,LIGHTCONF 使用 netty 实现底层的长连接通讯, 部署足够的轻量级, 只需要将项目中的 lightconf-admin-web 部署即可, 不需要额外的安装 Redis,zk 等.
源码仓库地址
源码仓库地址 | Release Download |
---|---|
https://github.com/haifeiWu/lightconf | Download https://github.com/haifeiWu/lightconf/releases |
1.5 环境
- Maven3+
- Jdk1.7+
- Tomcat7+
- Mysql5.5+
二, 快速入门
2.1 初始化 "数据库"
请下载项目源码并解压, 获取 "调度数据库初始化 SQL 脚本" 并执行即可. 脚本位置如下:
lightconf/doc/db/light-conf-0.1.1V.sql
2.2 编译源码
解压源码, 按照 maven 格式将源码导入 IDE, 使用 maven 进行编译即可
lightconf-admin: 配置管理中心
lightconf-core: 公共依赖
lightconf-common: 公共依赖
lightconf-sample: 接入 LIGHTCONF 的 Demo 项目
2.3 "配置管理中心" 项目配置
项目: lightconf-admin
作用: 管理线上配置信息
配置文件位置:
lightconf/lightconf-admin/lightconf-admin-web/src/main/resources/light-conf.properties
配置项目说明:
- # 配置登录 lightconf 的用户名, 密码
- light.conf.login.username=admin
- light.conf.login.password=123456
- # mysql database setting
- jdbc.type=mysql
- jdbc.driver=com.mysql.jdbc.Driver
- jdbc.url=jdbc:mysql://localhost:3306/light-conf?useUnicode=true&characterEncoding=utf-8
- jdbc.username=root
- jdbc.password=root_pwd
- # pool settings
- jdbc.pool.init=2
- jdbc.pool.minIdle=3
- jdbc.pool.maxActive=20
- # jdbc.testSql=SELECT 'x'
- jdbc.testSql=SELECT 'x' FROM DUAL
- # 服务端启动监听端口
- netty.server.port=9998
2.4 "接入 LIGHTCONF 的示例项目" 项目配置
项目: lightconf-sample
作用: 接入 LIGHTCONF 的示例项目, 供用户参考学习
A, 引入 maven 依赖
- <!-- lightconf-client -->
- <dependency>
- <groupId>com.lightconf</groupId>
- <artifactId>lightconf-core</artifactId>
- <version>${project.parent.version}</version>
- </dependency>
B, 添加 LIGHTCONF 配置文件
可参考配置文件:
lightconf/lightconf-sample/src/main/resources/light-conf.properties
配置项说明:
- # 连接 light-conf-admin 的 IP 地址
- light.conf.host=127.0.0.1
- # 连接 light-conf-admin 的端口号
- light.conf.port=9998
- ## 接入应用的 uuid
application.uuid=8705d6c8-bbe0-420c-9853-f780de4cb5ea
C,LIGHTCONF 配置初始化 [必须]
可参考配置文件:
lightconf/lightconf-sample/src/main/resources/spring/applicationcontext-light-conf.xml
配置项说明:
- <!-- ********************************* 核心配置 [必须]:LIGHTCONF 配置 ********************************* -->
- <bean id="xxlConf" class="com.lightconf.core.spring.LightConfFactory" init-method="init" destroy-method="destroy" />
- <!-- ********************************* 核心配置 [必须]:LIGHTCONF netty client 监听 ********************************* -->
- <bean id="lightConfListener" class="com.lightconf.core.listener.LightConfClientListener"></bean>
来源: https://juejin.im/post/5adc612d6fb9a07ac3630eb5