\351\205\215\347\275\256\344\270\255\345\277\203.md
... ...
@@ -156,4 +156,47 @@ Optional<String> test = ConfigUtils.get(appName, appTag, "test");
156 156
157 157
# 配置热更新
158 158
159
+## 概述
160
+本文档旨在阐述配置中心新增的热更新功能。该功能允许应用app在配置中心的内容发生变化时,自动探测并应用最新的配置,从而无需重启服务即可实现配置的即时更新。此功能仅在 `DISTRIBUTED_V2` 模式下有效。
161
+## 功能实现
162
+### 1. 配置新增
163
+首先,按照现有配置中心的规范,在 `app.json` 文件中添加以下配置项:
164
+```json
165
+ "appConfig": {
166
+ "storageType": {
167
+ "value": "mysql",
168
+ "desc": "操作日志存储类型:mysql/es",
169
+ "required": false
170
+ },
171
+ "esURI": {
172
+ "value": "http://192.168.175.198:19200",
173
+ "desc": "Elasticsearch服务URI。格式遵循RFC2396标准,例如:http://username:password@127.0.0.1:9200 或 http://127.0.0.1:9200",
174
+ "required": false
175
+ }
176
+ }
177
+```
178
+### 2. 配置查看与编辑
179
+添加完毕后,待引擎加载配置,您可以直接在 **开发者中心** 的 **配置中心** 页面查看和编辑上述配置项。
180
+
181
+[[http://iidp.chinasie.com:9999/iidpminio/config_center/配置中心列表.png]]
182
+
183
+### 3. 配置热更新
184
+为实现配置的自动热更新,您需要在app的业务代码编写如下监听器代码:
185
+```java
186
+ConfigUtils.onUpdate("base_log.master", (newValue) -> {
187
+ log.info("base_log.master 配置已更新,新值为:{}", newValue);
188
+});
189
+```
190
+
191
+在此,`onUpdate(String appNameTag, Consumer<String> consumer)` 方法用于注册配置更新监听器。其中:
192
+- `appNameTag`:由应用名称和版本号拼接而成(appName.tag),同时它也是配置项的键名。
193
+- `consumer`:这是一个回调函数,当配置更新时,它会被触发,接收一个JSON序列化为字符串的新配置值。
194
+ 回调函数的参数 `newValue` 包含了该app的所有配置项。即使某些配置项未发生变化,它们也会被包含在内,因为配置是以整体形式更新的。因此,业务代码中应进一步判断配置项的实际值是否真的发生了改变,如下所示:
195
+ ```java
196
+ if (!newValue.getString("foo").equals(oldValue.getString("foo"))) {
197
+ // 执行相关操作
198
+ }
199
+ ```
200
+所以说配置中心只是提供了配置更新后通知业务app的功能,具体的根据新配置项做哪些处理还是需要业务app自行处理。
159 201
202
+以上即为配置中心热更新功能的完整实现流程。通过此功能,app能够实时响应配置变更,从而大大提高系统的灵活性和可用性。