技术派自定义配置注入&动态刷新
对SpringBoot有过了解的小伙伴应该知道,一般我们的配置信息都是放在配置文件application.yml中,然后SpringBoot就会自动加载配置文件中的信息到Environment中,再应用中访问这些配置也比较简单,常见的有@Value, @ConfigurationProperties 以及 environment.getProperty 三种使用姿势(关于具体的配置使用姿势介绍可以看技术派中的配置读取方式的教程)。需要注意的是,SpringBoot应用中的配置读取简单,但是这些配置是不支持动态刷新的
目前技术派的运行,还没有引入配置中心来接管应用的相关配置,所以会看到我们的配置都是放在项目的配置文件中的,如下图

现在派聪明已经上线,我们将AI相关的配置也放在application-ai.yml配置文件中,由于某些大家都知道的原因,AI模型的secretKey需要经常更新,但是我们现在又没有统一的配置中心,所以就面临着每次更新配置都需要修改配置文件,然后重新部署启动应用,这整个过程还真有点麻烦;
鉴于此,技术派开发了一个对单体应用而言,非常实用的配置扩展,支持从自定义的数据源(MySQL)中获取配置,并注入到Environment中,且优先级最高,同时也需要支持配置的动态刷新
接下来让我们看一下具体的实现姿势
自定义配置源加载
1. MySQL存储全局配置
我们将自定义的配置存在数据库中,核心的字段就是配置的key, value
技术派中设计了一个非常简单的全局配置表 global_conf
CREATE TABLE `global_conf`
(
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`key` varchar(128) NOT NULL DEFAULT '' COMMENT '配置key',
`value` varchar(512) NOT NULL DEFAULT '' COMMENT '配置value',
`comment` varchar(128) NOT NULL DEFAULT '' COMMENT '注释',
`deleted` tinyint NOT NULL DEFAULT '0' COMMENT '是否删除 0 未删除 1 已删除',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`),
KEY `idx_key` (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='全局配置表';
扩展说明
- 对于实际业务上有相关诉求的小伙伴,建议再这个表上添加一个作用域(namesapce) + 版本(version),至于原因可以想一下
2. 自定义的配置加载注册
上面虽然定义了全局的配置源,但是我们怎样将这些配置注入到Spring的Environment中呢?
这里可以看一下DynamicConfigContainer的实现
step1: 读取配置到内存
首先借助一个Map来存储全局配置
/**
* 存储db中的全...未能定位到原文的划线
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复