配置中心里面的配置变了之后,该怎么让 bean 用新的配置创建 client 之类的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
boris1993Jr
V2EX    程序员

配置中心里面的配置变了之后,该怎么让 bean 用新的配置创建 client 之类的?

  •  
  •   boris1993Jr
    boris1993 2024-03-19 17:00:31 +08:00 1909 次点击
    这是一个创建于 637 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们有个项目,现在是把各种配置放在 properties 文件里,文件包含连接其他服务的地址、账号、密码之类的,如果配置有变化就改文件然后重新部署

    现在我们想要把这些配置放到配置中心里,但是现在遇到个问题是,假如说配置的密码变了,虽然我现在再取值能拿到新的密码,但是 bean 里面用的已经创建好的 client 还是在用老的密码去连

    试过监听到配置刷新事件后就在 Spring 的 bean registry 里 destroy 再 register singleton ,但是会报 there is already object [xxx] bound

    所以请问下我怎么样能让 bean 在配置刷新之后重建里面的各个 client ?

    谢谢!

    2 条回复    2024-03-19 20:38:15 +08:00
    zhovy
        1
    zhovy  
       2024-03-19 17:41:46 +08:00
    当配置中心中的配置发生变化时,需要让 Spring 容器中相关的 Bean 能够感知到这些变化,并重新初始化。在 Spring Cloud 中,你可以使用 @RefreshScope 注解来实现这一功能。这个注解可以使被标注的 Bean 在配置刷新时重新创建。

    以下是如何使用 @RefreshScope 来实现你的需求:

    添加依赖:
    确保你的项目中包含了 Spring Cloud Config 的相关依赖,以及 Spring Cloud Context (它包含了 @RefreshScope 注解)。

    标注 Bean:
    在你想要重新创建的 Bean 上使用 @RefreshScope 注解。

    java
    @Component
    @RefreshScope
    public class MyClient {
    // ...
    }
    触发刷新:
    当配置中心中的配置发生变化时,你可以通过发送一个 POST 请求到 /actuator/refresh 端点来触发 Spring 应用的配置刷新。这会导致所有带有 @RefreshScope 注解的 Bean 被重新创建,并使用最新的配置。

    安全性:
    请注意,/actuator/refresh 端点默认是开放的,这可能会带来安全风险。你应该通过 Spring Security 来保护这个端点,只允许授权的用户或服务访问。

    注意事项:
    不是所有的 Bean 都适合使用 @RefreshScope 。特别是那些持有打开的资源(如数据库连接)或参与事务管理的 Bean ,在重新创建时可能会导致问题。确保你了解 Bean 的生命周期和依赖关系,并只在合适的地方使用 @RefreshScope

    自定义配置源:
    如果你使用的是自定义的配置源而不是 Spring Cloud Config ,你可能需要实现自己的配置刷新逻辑。这通常涉及到监听配置变化的事件,并在事件发生时重新加载或重建相关的 Bean 。

    如果以上方法不能满足你的需求,你还可以考虑更复杂的解决方案,比如使用 Spring Cloud Bus 来在微服务集群中传播配置刷新事件,或者使用更底层的 Spring 生命周期管理 API 来手动管理 Bean 的生命周期。

    最后,记得在测试环境中充分测试你的配置刷新逻辑,以确保它在生产环境中能够正常工作。
    yuanxiaosong
        2
    yuanxiaosong  
       2024-03-19 20:38:15 +08:00
    @EventListener(ContextRefreshedEvent.class)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     909 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 21:38 PVG 05:38 LAX 13:38 JFK 16:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86