b6c36601f789079c74ae989663bb872bfa25e917
\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能够实时响应配置变更,从而大大提高系统的灵活性和可用性。 |