V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
bluecube13
V2EX  ›  程序员

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

  •  1
     
  •   bluecube13 · 2023-07-28 15:29:42 +08:00 · 3111 次点击
    这是一个创建于 517 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    还有如下要求:

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

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

    不过至少要引入 RefreshScope 的实现吧,应该是 Spring Cloud Common/Spring Cloud Context 。然后自己参考上面那些配置中心是怎么结合 RefreshScope 实现动态刷新的,然后自己写一个监听文件(单机)/监听 Zookeeper 、Redis 、数据库(多实例)实现。
    bluecube13
        15
    bluecube13  
    OP
       2023-07-28 16:59:27 +08:00
    感谢各位 v 友的回复!我都了解看看!
    damai0419
        16
    damai0419  
       2023-07-28 17:08:20 +08:00
    如果你的需求很简单,可以参考 https://juejin.cn/post/7049177692754673694#heading-3 的最后一小节,自己简单的写一个接口就可以了。
    burymme11
        17
    burymme11  
       2023-07-28 18:13:33 +08:00
    SpringCloud config 或者 k8s configMap.
    ourslay
        18
    ourslay  
       2023-07-28 18:50:13 +08:00 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-07-28 18:51:22 +08:00
    你需要的是配置中心. 这和 spring 没关系, 本质是个定时更新数据到本地缓存, 然后读缓存的逻辑.
    v2eb
        20
    v2eb  
       2023-07-28 18:57:52 +08:00
    自己写个配置的地方, 每次触发主动向下游系统推送下, 要不下游系统定时拉取下🐒
    zsdroid
        21
    zsdroid  
       2023-07-28 19:00:55 +08:00
    手撸一个注册中心
    potatowish
        22
    potatowish  
       2023-07-28 19:12:07 +08:00 via iPhone
    不使用配置中心服务,手撸一个简单的,配置保存在独立的数据库中,然后声明一个属性 bean ,读取配置,定时刷新即可。如果想做到自动实时刷新,可以监听一下对应配置表的 binlog 事件
    lzrainchen
        23
    lzrainchen  
       2023-07-28 19:40:28 +08:00
    不需要任何配置中心,不需要什么 config ,你只需要了解 ConfigurableEnvironment 、PropertySource 这两个就可以了,这些都是 spring-core 的能力,简单来讲 Spring 在运行时获取数据都是从这些来源查找的,不管你是在 application.properties 还是环境变量的都是从这些来源进行查找的。换句话来讲,spring-cloud-config 也是这么实现的,你可以很清楚的看到这些配置文件的可以来源于本地文件读取出来的,也可以是通过网络来的( git 、svn )都可以只要能读取出来然后往 PropertySource 里塞,你程序就可以读取到了,原理就是这么简单。简单的代码只需要两行
    lzrainchen
        24
    lzrainchen  
       2023-07-28 19:44:50 +08:00   ❤️ 2
    ConfigurableEnvironment environment = applicationContext.getEnvironment();
    MutablePropertySources propertySources = environment.getPropertySources();
    然后往 propertySources 里塞你的 key value 配置,如果配置有变动再放一遍就行了 实时变化的,所有的功能都是搭建再这些东西之上的
    kerb15
        25
    kerb15  
       2023-07-28 21:07:05 +08:00
    一直想知道 nacos 和 apollo 哪个资源占用高一点
    XuHuan1025
        26
    XuHuan1025  
       2023-07-28 21:59:41 +08:00
    @tgich Refreshscope
    wellerman
        27
    wellerman  
       2023-07-29 00:16:41 +08:00
    nacos 推荐内存最低都 4G 了,还要多启个服务。apollo 通过 ConfigFactory 可以自定义配置,如读取数据库中的配置信息。
    jdOY
        28
    jdOY  
       2023-07-29 01:27:53 +08:00
    拿 redis 存,代码自己封装下,要用配置的时候读取的顺序 redis>配置文件>硬编码
    james122333
        29
    james122333  
       2023-07-30 01:16:09 +08:00 via Android
    不要用 spring 自己写 整天 api 呼叫来呼叫去服务太多看起来有点傻
    最简单就是挂载一个网路硬盘 侦测档案变化读入即可
    可以用 Java watchservice
    james122333
        30
    james122333  
       2023-07-30 01:20:49 +08:00 via Android
    这么做的好处是本机都可以检查
    手刻党才是王道
    20g
        31
    20g  
       2023-08-01 11:05:08 +08:00
    @tgich 你要在 yml 配置 refresh:true ,这样子 nacos 发布的时候,后台就会自动更新配置文件了
    tgich
        32
    tgich  
       2023-08-01 16:49:30 +08:00
    @20g 我这里 yml 里写的是 refresh-enabled:true
    tgich
        33
    tgich  
       2023-08-01 16:50:18 +08:00
    @20g 我这里 yml 里写的是 refresh-enabled:true ,不知道 refresh:true 怎么没有提示
    20g
        34
    20g  
       2023-08-03 13:56:05 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4096 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:30 · PVG 13:30 · LAX 21:30 · JFK 00:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.