V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
boris1993Jr
V2EX  ?  程序员

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

  •  
  •   boris1993Jr ·
    boris1993 · 54 天前 · 1013 次点击
    这是一个创建于 54 天前的主题,其中的信息可能已经有所发展或是发生改变。

    腾讯云最新优惠活动来了:云产品限时1折,云服务器低至88元/年 ,点击这里立即抢购:9i0i.cn/qcloud,更有2860元代金券免费领取,付款直接抵现金用,点击这里立即领取:9i0i.cn/qcloudquan

    (福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

    我们有个项目,现在是把各种配置放在 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  
       54 天前
    当配置中心中的配置发生变化时,需要让 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  
       53 天前
    @EventListener(ContextRefreshedEvent.class)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2709 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:51 · PVG 18:51 · LAX 03:51 · JFK 06:51
    Developed with CodeLauncher
    ? Do have faith in what you're doing.


    http://www.vxiaotou.com