Spring Boot 基于 BeanPostProcessor + Redis 轻量级属性动态配置
分布式系统中,动态配置管理常依赖 Nacos、Spring Cloud Config,Apollo 等配置中心,但引入独立中间件会显著增加运维成本和架构复杂度。为平衡功能需求与系统轻量化,本方案基于 Redis 发布订阅机制与 BeanPostProcessor 扩展点,实现了一套零外部依赖的动态配置更新体系。
核心实现
核心机制 利用 BeanPostProcessor 在 Bean 初始化阶段拦截 @DynamicValue 注解,将动态属性键与 Bean 属性的建立绑定关系。
动态更新 通过 Redis 的 Pub/Sub 模块监听配置变更事件,实时反射更新内存中已绑定的 Bean 属性值,实现秒级生效的无缝热更新。
核心代码说明
- @DynamicValue,用于 Spring 扫描 Bean 对象的时候,可以直接管理这些配置了自定义注解的类的属性, value 的格式 (key:defaultValue)
- DynamicValueBeanFactory 实现了 BeanPostProcessor,这样我们就可以拿到 Spring 所有实例化后的 Bean 对象。Spring 是扫描你所工程下所有的 Bean 对象,加载到它的容器里管理。postProcessAfterInitialization 扫描所有的 Bean 对象,之后检查哪个类的属性加有 @DynamicValue 注解,检测到后进行管理操作。
使用
- 引入依赖
xml
<dependency>
<groupId>com.ssn.boot</groupId>
<artifactId>spring-boot-starter-dynamic-config</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
- 需要动态配置的地方,添加自定义注解
java
@RestController
@RequestMapping("dynamic")
public class DynamicController {
@DynamicValue("group:dm")
private String group;
@Autowired
private RTopic dynamicTopic;
@GetMapping("config")
public String getGroup() {
return group;
}
@GetMapping("{key}/{value}")
public String updateGroup(@PathVariable String key,@PathVariable String value) {
dynamicTopic.publish(key + DynamicConstants.SPLIT + value);
return group;
}
}
- yml 添加相关配置
yml
dynamic:
config:
enable: true
host: redis://127.0.0.1:6379
namespace: test
server:
port: 8999
测试
- 开始访问, 默认返回 dm
- 访问修改配置的接口,key = group, dm = dm222
- 再次访问,返回 dm222, 说明动态属性配置生效了