配置中心
配置 APP 仓库地址 sie-snest-config-project
需求
之前 IIDP 的配置都来自于 application.properties。如果 APP 想要增加自己的配置,也需要添加到 application.properties,而这样会导致配置文件堆积大量的配置。并且有可能导致冲突。
配置中心目前实现三点功能
- APP 可以将配置写到自己的 APP 里面,从而避免跟其他 APP 的配置造成命名冲突。
- 提供配置中心页面,可以在页面上动态修改配置,从而实现不停机动态修改 APP 的行为。
- 必填校验。APP 可以可以将配置项声明为必填项,那么从应用市场安装的时候会校验配置是否有值,如果没有填写值,将会安装失败。
使用例子
实现设计
声明配置
在 app.json 填入配置
"globalConfig": {
"backendUrl": {
"desc": "微服务后端URL",
"value": "http://localhost"
}
},
"appConfig": {
"test": {
"desc": "测试配置",
"value": "123",
"required": true
}
}
配置分为两类
- globalConfig a. 由平台定义,一般是引擎有特殊用途的配置。
- appConfig a. 由 APP 自行定义,由 APP 业务上使用。
配置项说明
- desc: 配置项的说明
- 对于 globalConfig,desc 并不是必须的,因为平台开发者在引擎声明 GlobalConfig 的同时就写了描述。
- value: 配置值,必须为字符串
- required: 配置是否必填。如果为 true,那么应用安装的时候需要先填写配置项才能安装
使用示例
升级说明
在 apps 的 apps.json 添加 sie-snest-config 。
"apps": {
"SDK": [
"sie-snest-base-1.0-SNAPSHOT.jar",
"sie-snest-file-1.0-SNAPSHOT.jar",
"sie-snest-dict-1.0-SNAPSHOT.jar",
"sie-snest-log-2.0-SNAPSHOT.jar",
"sie-snest-config-1.0-SNAPSHOT.jar"
]
}
系统配置
声明配置
平台开发人员如果想要新增配置,在可以在 com.sie.snest.engine.config.GlobalConfig 这个枚举类中添加配置项。
因为 GlobalConfig 这个类是在引擎工程里,所以只有平台开发人员可以声明配置项。
使用配置
Optional<String> frontendUrl = ConfigUtils.getGlobalConfig(appName, appTag, GlobalConfig.FRONTEND_URL);
APP 设置系统配置
在 app.json 里面设置值
"globalConfig": {
"frontendUrl": {
"desc": "微服务前端URL",
"value": "http://localhost"
}
}
系统配置也可以设置为 required = true,这样安装 APP 的时候会校验是否填写了配置值。
应用配置
声明配置
APP 的配置只需要在 app.json 里面声明。
"appConfig": {
"test": {
"desc": "测试配置",
"value": "",
"required": true
}
}
如果 value 为空字符串,required = true。应用上架的时候,该配置项默认为空,需要在配置中心填写了配置值后,才能安装。这样保证了应用安装完成后,在启动事件也能拿到对应的值。
使用配置
Optional<String> test = ConfigUtils.get(appName, appTag, "test");
配置中心
在开发者中心 - 配置中心,可以动态修改所有配置。并且配置会保存到数据库。
必填配置
如果配置项的 required 为 true。上架的时候,会校验 value 是否有值,如果没有值会提示先填写配置值。在配置中心修改保存的时候,也会校验是否有填写值。
"appConfig": {
"test": {
"desc": "测试配置",
"value": "",
"required": true
}
}
安装前校验
修改配置时校验
配置热更新
概述
本文档旨在阐述配置中心新增的热更新功能。该功能允许应用app在配置中心的内容发生变化时,自动探测并应用最新的配置,从而无需重启服务即可实现配置的即时更新。此功能仅在 DISTRIBUTED_V2
模式下有效。
功能实现
1. 配置新增
首先,按照现有配置中心的规范,在 app.json
文件中添加以下配置项:
"appConfig": {
"storageType": {
"value": "mysql",
"desc": "操作日志存储类型:mysql/es",
"required": false
},
"esURI": {
"value": "http://192.168.175.198:19200",
"desc": "Elasticsearch服务URI。格式遵循RFC2396标准,例如:http://username:password@127.0.0.1:9200 或 http://127.0.0.1:9200",
"required": false
}
}
2. 配置查看与编辑
添加完毕后,待引擎加载配置,您可以直接在 开发者中心 的 配置中心 页面查看和编辑上述配置项。
3. 配置热更新
为实现配置的自动热更新,您需要在app的业务代码编写如下监听器代码:
ConfigUtils.onUpdate("base_log.master", (newValue) -> {
log.info("base_log.master 配置已更新,新值为:{}", newValue);
});
在此,onUpdate(String appNameTag, Consumer<String> consumer)
方法用于注册配置更新监听器。其中:
-
appNameTag
:由应用名称和版本号拼接而成(appName.tag),同时它也是配置项的键名。 -
consumer
:这是一个回调函数,当配置更新时,它会被触发,接收一个JSON序列化为字符串的新配置值,比如{"foo":"bar","number":123,"storageType":"1"}
,注意其中的storageType: 1
就是上面app.json
配置中的 key value 的键值内容。 回调函数的参数newValue
包含了该app的所有配置项。即使某些配置项未发生变化,它们也会被包含在内,因为配置是以整体形式更新的。因此,业务代码中应进一步判断配置项的实际值是否真的发生了改变,如下所示:if (!newValue.getString("foo").equals(oldValue.getString("foo"))) { // 执行相关操作 }
所以说配置中心只是提供了配置更新后通知业务app的功能,具体的根据新配置项做哪些处理还是需要业务app自行处理。
以上即为配置中心热更新功能的完整实现流程。通过此功能,app能够实时响应配置变更,从而大大提高系统的灵活性和可用性。