SpringBoot动态读取nacos配置(配置热更新)

2024-02-29 1635阅读

温馨提示:这篇文章已超过386天没有更新,请注意相关的内容是否还可用!

在微服务架构中,配置的动态更新对于应用的灵活性和可维护性至关重要。Spring Cloud 提供了一种机制,即@RefreshScope注解,用于实现配置的热更新。本文将介绍配置热更新的原理以及@RefreshScope的作用。

SpringBoot动态读取nacos配置(配置热更新)
(图片来源网络,侵删)

配置热更新原理

配置热更新的原理基于 Spring Cloud Config 和 Spring Cloud Bus。

  1. Spring Cloud Config: Spring Cloud Config 允许将应用的配置集中存储在远程版本控制仓库(如 Git、SVN)中,并通过 HTTP 或消息代理服务(如 RabbitMQ、Kafka)向应用提供配置信息。应用启动时会从配置服务器获取配置信息。

  2. Spring Cloud Bus: Spring Cloud Bus 是一个事件总线,用于在分布式系统中传播状态更改。它基于消息代理服务,当应用的配置发生变化时,通过 Spring Cloud Bus 可以广播消息,通知所有相关的微服务实例进行配置更新。

结合 Spring Cloud Config 和 Spring Cloud Bus,实现配置热更新的流程如下:

  • 开发人员或运维人员更新配置文件存储在配置服务器中。
  • 配置服务器接收到配置更新后,通过 Spring Cloud Bus 向消息代理服务发送配置变更的消息。
  • 订阅了消息代理服务的微服务实例接收到消息后,重新从配置服务器获取最新的配置信息,并应用到应用程序中。

    @RefreshScope的作用

    @RefreshScope注解用于标记 Spring Bean,表明该 Bean 的属性在配置发生变化时需要进行动态更新。当配置更新后,Spring 容器会重新创建带有@RefreshScope注解的 Bean,从而使得新的配置生效。

    具体实现步骤如下:

    1. Bean创建阶段: 当应用启动时,带有@RefreshScope注解的 Bean 被创建并初始化。这些 Bean 的属性值被填充为应用启动时配置的值。

    2. 配置更新阶段: 当配置发生变化时,Spring Cloud Bus 广播配置变更的消息。

    3. 动态更新阶段: 订阅了消息代理服务的微服务实例接收到消息后,Spring Cloud Config 会重新加载配置,而带有@RefreshScope注解的 Bean 会被标记为“脏”(dirty)。在 Bean 被访问时,Spring 容器会检测到该 Bean 是“脏”的,重新创建并初始化该 Bean,从而更新 Bean 的属性值为最新的配置值。

    示例

    以下是一个简单的示例,演示了如何在 Spring Boot 中使用@RefreshScope实现配置的热更新:

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    @RefreshScope
    public class ConfigController {
        @Value("${message:Hello World}")
        private String message;
        @GetMapping("/message")
        public String getMessage() {
            return message;
        }
    }
    

    在这个示例中,message属性被@Value注解注入,并带有@RefreshScope注解。当配置发生变化时,message属性的值会动态更新。

    实战案例

    在程序中 我需要读取到动态配置的百分比比例值 但是不能每次更新都查询Mysql(造成IO浪费)

    也不能每次更新项目(浪费时间)

    所以选择使用@RefreshScope

    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.stereotype.Component;
    /**
     * @author zhangjiaxuan
     */
    @Component
    @ConfigurationProperties(prefix = "your.nacos.count.path")
    @Data
    @RefreshScope
    public class YourClassName {
        // 这里直接和nacos中参数对应就行
        private Long day;
        private Long year;
    }

    然后在需要动态读取参数的程序中引入YourClassName.class(这里自己定义名称)

    @Resource
    YourClassName yourClassName;

    然后直接yourClassName.get

    就可以实现动态读取nacos上的配置了

    结论

    通过 Spring Cloud Config 和 Spring Cloud Bus,以及@RefreshScope注解,我们可以实现配置的热更新,从而提高了微服务架构下应用的灵活性和可维护性。配置热更新使得应用能够在运行时动态适应变化的环境,为持续集成和持续部署提供了基础支持。

    通常使用方向:

    程序开关/程序热更新数据/

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]