- 新增 kenaito-conf-springboot3-client,支持配置拉取、增量同步、@Value/@ConfigurationProperties 动态刷新和本地缓存 - 新增 kenaito-conf-springboot3-client-demo(端口 8084)及 Dockerfile.springboot3 - 完善中英文 README、Docker 部署文档,修正 Spring Boot 2 客户端配置键名与 demo 端口说明 - 修复增量同步将服务端 code=0 成功响应误判为错误的问题
8.9 KiB
Kenaito Config Center Spring Boot 3 Client
English | 中文
适用于 Spring Boot 3.x / JDK 17+ 应用的配置中心客户端,支持启动时拉取远程配置、定时同步、@Value 与 @ConfigurationProperties 字段动态刷新,以及配置中心不可用时的本地缓存降级。
功能特性
- 应用启动前从配置中心拉取全量配置,注入 Spring
Environment - 定时轮询增量变更(新增、修改、删除),无需重启应用
- 自动刷新
@Value字段和@ConfigurationPropertiesBean - 支持通过
ConfigChangeHanlder监听配置变更 - 本地文件缓存(
config-cache.log),配置中心不可用时自动降级 - 敏感配置日志脱敏
- 支持配置中心多地址(
base-url使用,或;分隔,自动故障转移) - Spring Boot 3 自动配置(
AutoConfiguration.imports)
环境要求
| 项目 | 版本 |
|---|---|
| JDK | 17+ |
| Spring Boot | 3.x |
| Maven | 3.6+ |
Spring Boot 2.x / JDK 8 项目请使用
kenaito-conf-springboot2-client。
安装
Maven 依赖
<dependency>
<groupId>cn.odboy</groupId>
<artifactId>kenaito-conf-springboot3-client</artifactId>
<version>1.0.0</version>
</dependency>
本地安装(开发调试)
cd kenaito-conf-springboot3-client
mvn clean install
快速开始
1. 添加配置
在 application.properties 中添加配置中心连接参数:
# 配置中心地址(多个地址用逗号分隔)
kenaito.config.base-url=http://localhost:8080
# 应用名称(必填)
kenaito.config.app-name=my-app
# 环境(dev/daily/prod)
kenaito.config.profile=daily
# 配置版本(默认 latest)
kenaito.config.version=latest
# 认证令牌(应用开启 Token 校验时必填)
kenaito.config.token=your-token
# 是否启用远程配置(默认 true)
kenaito.config.enabled=true
# 同步间隔(秒,默认 60)
kenaito.config.sync-interval-seconds=10
# 敏感配置键(用于日志脱敏,逗号分隔)
kenaito.config.sensitive-keys=password,secret,key,token
也可以使用 YAML:
kenaito:
config:
base-url: http://localhost:8080
app-name: my-app
profile: daily
version: latest
sync-interval-seconds: 10
2. 使用 @Value 注入配置
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConfigController {
@Value("${database.host:localhost}")
private String databaseHost;
@Value("${database.port:3306}")
private Integer databasePort;
@Value("${feature.enabled:false}")
private Boolean featureEnabled;
@GetMapping("/config")
public String config() {
return databaseHost + ":" + databasePort + ", feature=" + featureEnabled;
}
}
配置中心的值会覆盖 application.properties 中的同名配置。
3. 使用 @ConfigurationProperties
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "database")
public class DatabaseProperties {
private String host;
private Integer port;
private String username;
private String password;
// getters and setters
}
4. 监听配置变更
实现 ConfigChangeHanlder 并注册为 Spring Bean:
import cn.odboy.confcenter.ConfigChangeHanlder;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class MyConfigChangeListener implements ConfigChangeHanlder {
@Override
public void onConfigChanged(Map<String, Object> changedConfigs) {
changedConfigs.forEach((key, value) ->
System.out.printf("config changed: %s = %s%n", key, value));
}
}
5. 自动刷新
配置中心的配置发生变更后,客户端会在下一个同步周期内:
- 更新
ConfigcenterContext中的配置值; - 更新 Spring
Environment中的kenaitoConfigPropertySource; - 回调所有
ConfigChangeHanlderBean; - 刷新受影响的
@Value字段和@ConfigurationProperties字段。
刷新日志示例:
[RefreshScope] refreshed @Value field: cn.odboy.demo.ConfigController.host | old='10.0.0.1' | new='10.0.0.2'
[RefreshScope] refreshed @ConfigurationProperties field: cn.odboy.demo.DatabaseProperties.port = '13306'
与 Spring Cloud 的
@RefreshScope不同,本客户端直接通过反射刷新字段,不需要spring-cloud-context依赖。
配置项说明
| 配置项 | 说明 | 默认值 | 必填 |
|---|---|---|---|
kenaito.config.base-url |
配置中心地址,多个地址用 , 或 ; 分隔 |
- | 是 |
kenaito.config.app-name |
应用名称(配置中心中的应用编码) | spring.application.name |
是 |
kenaito.config.profile |
环境标识 | dev |
否 |
kenaito.config.version |
配置版本 | latest |
否 |
kenaito.config.token |
认证令牌 | 空 | 否 |
kenaito.config.enabled |
是否启用远程配置 | true |
否 |
kenaito.config.sync-interval-seconds |
增量同步间隔(秒) | 60 |
否 |
kenaito.config.global-ignore |
是否忽略业务组全局配置 | false |
否 |
kenaito.config.sensitive-keys |
日志中需要脱敏的键(逗号分隔) | password,passwd,key,secret,token,credentials |
否 |
kenaito.config.local-storage-dir |
本地缓存目录 | 应用工作目录 | 否 |
baseUrl/appName/base-url/app-name等驼峰写法和旧的kenaito.configcenter.*前缀同样兼容,推荐使用表中列出的中划线写法。
自动配置说明
客户端通过 Spring Boot 3 的自动配置机制工作,引入依赖并配置参数即可使用,无需手动注册 Bean:
KenaitoEnvironmentInitializer通过META-INF/spring.factories注册的EnvironmentPostProcessor,在 Spring 上下文创建前拉取远程配置,并将其作为最高优先级的 PropertySource 加入Environment。KenaitoRefreshAutoConfiguration通过META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports注册的自动配置,负责:- 将
ApplicationContext交给客户端; - 注册
RefreshScopeRegistry(BeanPostProcessor),收集@Value字段与@ConfigurationPropertiesBean; - 在配置变更时刷新受影响的字段。
- 将
与 Spring Boot 2 客户端的差异
| 项目 | Spring Boot 2 客户端 | Spring Boot 3 客户端 |
|---|---|---|
| JDK | 8+ | 17+ |
| Spring Boot | 2.x | 3.x |
| 自动配置注册 | META-INF/spring.factories |
META-INF/spring/...AutoConfiguration.imports |
| 公共 API | ConfigChangeHanlder 等 |
相同 |
Demo
Demo 项目:kenaito-conf-springboot3-client-demo
# 先安装客户端到本地仓库
cd kenaito-conf-springboot3-client
mvn clean install
# 启动 Demo
cd ../kenaito-conf-springboot3-client-demo
mvn spring-boot:run
Demo 默认配置:
- 端口:
8084 - 应用名称:
kenaito-springboot-demo(可通过KENAITO_APP_NAME覆盖) - 环境:
daily(可通过KENAITO_ENV覆盖) - 配置中心地址:
http://localhost:8080(可通过KENAITO_BASE_URL覆盖)
可用接口:
| 接口 | 说明 |
|---|---|
GET / |
应用信息与部分配置 |
GET /config |
@Value 注入的配置 |
GET /configprops |
@ConfigurationProperties 绑定的配置 |
GET /changes |
最近 20 次配置变更记录 |
GET /health |
健康检查 |
本地缓存与容灾
客户端在成功拉取远程配置后,会将配置写入本地缓存文件 config-cache.log(默认位于应用工作目录,可通过 kenaito.config.local-storage-dir 指定)。
当配置中心不可用且本地存在缓存时,客户端会从缓存加载配置,保证应用仍可启动;同时定时轮询会持续重试,配置中心恢复后自动继续同步。
注意事项
- 刷新类型限制:
@Value刷新支持String、int/Integer、long/Long、boolean/Boolean、double/Double、float/Float、short/Short、byte/Byte、char/Character,其他类型按字符串尝试赋值。 - 配置优先级:远程配置优先于本地同名配置;配置中心连接参数(
kenaito.config.*)以本地配置为准。 - 启动失败:未配置
base-url或app-name时应用启动失败;配置中心暂时不可用不会阻止启动(若本地无缓存,则仅使用本地配置)。 - 日志脱敏:键名包含敏感词的配置在启动日志中只显示前一半字符 +
****。 - 多实例:每个应用实例独立轮询配置中心,变更检测基于
lastTime时间戳。
版本历史
- 1.0.0 - 初始版本,适配 Spring Boot 3 / JDK 17