bluecube13
V2EX  ›  程序员

SpringBoot 如何优雅的实现动态更新配置?

By bluecube13 at 2023 年 7 月 28 日 · 4775 次点击

想动态的更新某个 application.yml 中配置的 config 并让其生效,有什么优雅且简单的实现方式吗?

还有如下要求:

  1. 不使用 SpringCloud config
  2. 某个微服务有不固定数量的实例
  3. 系统不要有 downtime
34 条回复  •  2023-08-03 13:56:05 +08:00
F281M6Dh8DXpD1g2
   1
F281M6Dh8DXpD1g2  
   2023 年 7 月 28 日
滚动发布不就完了
bluecube13
   2
bluecube13  
OP
   2023 年 7 月 28 日
@liprais #1 老哥能不能稍微详细的说一下,谢谢
dddd1919
   3
dddd1919  
   2023 年 7 月 28 日   ❤️ 4
Apollo config
taylorzhi
   4
taylorzhi  
   2023 年 7 月 28 日
Nacos
senjyougahara
   5
senjyougahara  
   2023 年 7 月 28 日
nacos+1
N9f8Pmek6m8iRWYe
   6
N9f8Pmek6m8iRWYe  
   2023 年 7 月 28 日
BiChengfei
   7
BiChengfei  
   2023 年 7 月 28 日
配置项改成外部读取,例如数据库、宿主机配置文件
20g
   8
20g  
   2023 年 7 月 28 日
nacos 配置就好了,改了配置重新发布 nacos ,不需要停机发布了
AmaQuinton
   9
AmaQuinton  
   2023 年 7 月 28 日
部署在 k8s 上
sangbiao
   10
sangbiao  
   2023 年 7 月 28 日
@20g 为何我司的 nacos 重新发布还要重启服务,不重启服务还是老配置,什么原因
Masoud2023
   11
Masoud2023  
   2023 年 7 月 28 日
不谈用谁家的 solution ,你要是 SpringCloud 都不想用的话那基本无解了,动态配置管理本来就是 SpringCloud 的东西,要么就自己写一个 service 搞 RPC 去读配置,但是太费劲了。

SpringCloud 有什么不能用的?那东西其实没多难的。
Masoud2023
   12
Masoud2023  
   2023 年 7 月 28 日
@tgich #10 yml `refresh: true` 配置了吗
zjw7sky
   13
zjw7sky  
   2023 年 7 月 28 日
nacos
Jrue0011
   14
Jrue0011  
   2023 年 7 月 28 日
不想引入 Spring Cloud Config ,是指不想引入运维 Spring Cloud Config Server (或者 Nacos 、Apollo 这些配置中心)的成本?

不过至少要引入 RefreshScope 的实现吧,应该是 Spring Cloud Common/Spring Cloud Context 。然后自己参考上面那些配置中心是怎么结合 RefreshScope 实现动态刷新的,然后自己写一个监听文件(单机)/监听 Zookeeper 、Redis 、数据库(多实例)实现。
bluecube13
   15
bluecube13  
OP
   2023 年 7 月 28 日
感谢各位 v 友的回复!我都了解看看!
damai0419
   16
damai0419  
   2023 年 7 月 28 日
如果你的需求很简单,可以参考 https://juejin.cn/post/7049177692754673694#heading-3 的最后一小节,自己简单的写一个接口就可以了。
burymme11
   17
burymme11  
   2023 年 7 月 28 日
SpringCloud config 或者 k8s configMap.
ourslay
   18
ourslay  
   2023 年 7 月 28 日 via iPhone
refresh-scope 应该比较优雅实现。只需要引入 spring-cloud-commons 依赖即可
https://docs.spring.io/spring-cloud-commons/docs/4.0.3/reference/html/#refresh-scope
Ericcccccccc
   19
Ericcccccccc  
   2023 年 7 月 28 日
你需要的是配置中心. 这和 spring 没关系, 本质是个定时更新数据到本地缓存, 然后读缓存的逻辑.
v2eb
   20
v2eb  
   2023 年 7 月 28 日
自己写个配置的地方, 每次触发主动向下游系统推送下, 要不下游系统定时拉取下🐒
zsdroid
   21
zsdroid  
   2023 年 7 月 28 日
手撸一个注册中心
potatowish
   22
potatowish  
   2023 年 7 月 28 日 via iPhone
不使用配置中心服务,手撸一个简单的,配置保存在独立的数据库中,然后声明一个属性 bean ,读取配置,定时刷新即可。如果想做到自动实时刷新,可以监听一下对应配置表的 binlog 事件
lzrainchen
   23
lzrainchen  
   2023 年 7 月 28 日
不需要任何配置中心,不需要什么 config ,你只需要了解 ConfigurableEnvironment 、PropertySource 这两个就可以了,这些都是 spring-core 的能力,简单来讲 Spring 在运行时获取数据都是从这些来源查找的,不管你是在 application.properties 还是环境变量的都是从这些来源进行查找的。换句话来讲,spring-cloud-config 也是这么实现的,你可以很清楚的看到这些配置文件的可以来源于本地文件读取出来的,也可以是通过网络来的( git 、svn )都可以只要能读取出来然后往 PropertySource 里塞,你程序就可以读取到了,原理就是这么简单。简单的代码只需要两行
lzrainchen
   24
lzrainchen  
   2023 年 7 月 28 日   ❤️ 2
ConfigurableEnvironment environment = applicationContext.getEnvironment();
MutablePropertySources propertySources = environment.getPropertySources();
然后往 propertySources 里塞你的 key value 配置,如果配置有变动再放一遍就行了 实时变化的,所有的功能都是搭建再这些东西之上的
ex1gtnim7d
   25
ex1gtnim7d  
   2023 年 7 月 28 日
一直想知道 nacos 和 apollo 哪个资源占用高一点
XuHuan1025
   26
XuHuan1025  
   2023 年 7 月 28 日
@tgich Refreshscope
wellerman
   27
wellerman  
   2023 年 7 月 29 日
nacos 推荐内存最低都 4G 了,还要多启个服务。apollo 通过 ConfigFactory 可以自定义配置,如读取数据库中的配置信息。
jdOY
   28
jdOY  
   2023 年 7 月 29 日
拿 redis 存,代码自己封装下,要用配置的时候读取的顺序 redis>配置文件>硬编码
james122333
   29
james122333  
   2023 年 7 月 30 日 via Android
不要用 spring 自己写 整天 api 呼叫来呼叫去服务太多看起来有点傻
最简单就是挂载一个网路硬盘 侦测档案变化读入即可
可以用 Java watchservice
james122333
   30
james122333  
   2023 年 7 月 30 日 via Android
这么做的好处是本机都可以检查
手刻党才是王道
20g
   31
20g  
   2023 年 8 月 1 日
@tgich 你要在 yml 配置 refresh:true ,这样子 nacos 发布的时候,后台就会自动更新配置文件了
sangbiao
   32
sangbiao  
   2023 年 8 月 1 日
@20g 我这里 yml 里写的是 refresh-enabled:true
sangbiao
   33
sangbiao  
   2023 年 8 月 1 日
@20g 我这里 yml 里写的是 refresh-enabled:true ,不知道 refresh:true 怎么没有提示
20g
   34
20g  
   2023 年 8 月 3 日
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
© 2026 V2EX · 60ms · 3.9.8.5