Spring Cloud动态配置刷新:@RefreshScope与@Component的协同机制解析
在微服务架构中,动态配置管理是实现服务灵活部署、快速响应业务变化的关键能力之一。Spring Cloud 提供了基于 @RefreshScope
和 @Component
的动态配置刷新机制,使得开发者可以在不重启服务的情况下更新配置。
本文将深入解析 @RefreshScope
与 @Component
的协同机制,结合完整代码示例演示其使用方式,并通过测试对比不同场景下的行为差异。
一、原理分析
1. @Component
的作用
@Component
是 Spring 框架的核心注解之一,用于标识一个类为 Spring 容器管理的组件。默认情况下,@Component
标记的 Bean 是 单例(singleton)作用域,在整个应用生命周期内只被初始化一次。
@Component
public class MyService {// ...
}
2. @RefreshScope
的作用
@RefreshScope
是 Spring Cloud 提供的一个自定义作用域注解,它允许 Bean 在每次调用时检查是否有新的配置变更。如果检测到配置更新,则丢弃旧实例并重新创建新实例,从而加载最新的配置值。
@Component
@RefreshScope
public class MyDynamicService {// ...
}
⚠️ 注意:
@RefreshScope
本质上是一个 代理作用域(proxy-based scope),并不会改变 Bean 的注册方式,而是通过 AOP 动态代理拦截方法调用,并决定是否需要重建实例。
3. 协同机制核心逻辑
- 当使用
@RefreshScope
注解标记某个 Bean 后,Spring 会为其生成一个 CGLIB 代理。 - 每次调用该 Bean 的方法时,代理会先检查当前上下文中的
Environment
是否发生了变化(如通过/actuator/refresh
触发)。 - 如果配置有更新,代理会丢弃旧的实例,并创建一个新的 Bean 实例以反映最新配置。
二、架构介绍
典型的 Spring Cloud 动态配置刷新架构如下:
+------------------+ +-------------------+ +------------------+
| Config Server |<-----> Git/SVN Repo | | Client Service |
| (spring-cloud-config) | (配置源) |-------> @RefreshScope |
+------------------+ +-------------------+ +------------------+
主要组件说明:
- Config Server:集中管理所有服务的配置信息,提供 REST 接口供客户端获取。
- Git/SVN Repo:作为配置文件的存储介质,支持版本控制和历史回溯。
- Client Service:通过集成 Spring Cloud Starter Config 获取配置,并通过
@RefreshScope
实现动态刷新。
三、实战代码介绍
1. 构建 Config Server
1.1 启动类
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args);}
}
1.2 配置文件 [application.yml](file:///Users/franks/workspace/franks/spring-ai-alibaba-examples/spring-ai-alibaba-chat-example/ark-chat/application.yml)
server:port: 8888
spring:cloud:config:server:git:uri: https://github.com/yourname/config-repo.git # 替换为你的配置仓库地址
1.3 Git 仓库结构示例
假设你有一个名为 config-repo
的 Git 仓库,包含如下文件:
└── config-client.yml
内容如下:
my:config:value: "initial-value"
2. 客户端服务配置与实现
2.1 添加依赖
<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>
2.2 配置文件 bootstrap.yml
spring:application:name: config-clientcloud:config:uri: http://localhost:8888fail-fast: true
management:endpoints:web:exposure:include: refresh
2.3 配置属性绑定类
@ConfigurationProperties(prefix = "my.config")
public class MyConfigProperties {private String value;public String getValue() {return value;}public void setValue(String value) {this.value = value;}
}
2.4 使用 @RefreshScope
的服务类
@Service
@RefreshScope
public class DynamicConfigService {@Autowiredprivate MyConfigProperties myConfigProperties;public void printCurrentValue() {System.out.println("Current Value: " + myConfigProperties.getValue());}
}
2.5 控制器类用于测试
@RestController
@RequestMapping("/api")
public class ConfigController {@Autowiredprivate DynamicConfigService dynamicConfigService;@GetMapping("/print")public String printValue() {dynamicConfigService.printCurrentValue();return "Value printed in logs.";}
}
2.6 主启动类
@SpringBootApplication
@EnableConfigurationProperties(MyConfigProperties.class)
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
四、应用实战与实践
1. 修改远程配置
将 Git 仓库中的 config-client.yml
文件修改为:
my:config:value: "updated-value"
提交并推送更改到远程仓库。
2. 发送 POST 请求触发刷新
curl -X POST http://localhost:8080/actuator/refresh
此时,Spring Cloud 会重新加载配置并重建所有带有 @RefreshScope
注解的 Bean。
3. 调用接口验证更新
curl http://localhost:8080/api/print
查看控制台输出是否为 "updated-value"
。
4. 日志输出示例
正常情况下你会看到类似以下输出:
Current Value: initial-value
Current Value: updated-value
这表明配置已成功刷新。
5. 可选:使用 Spring Cloud Bus 实现广播刷新(多实例场景)
5.1 添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
5.2 配置 RabbitMQ
spring:rabbitmq:host: localhostport: 5672username: guestpassword: guest
5.3 触发全局刷新
curl -X POST http://localhost:8080/actuator/bus-refresh
此时,所有连接了同一个消息队列的服务实例都会收到刷新事件并同步更新配置。
五、测试结果对比与分析
测试项 | 不使用 @RefreshScope | 使用 @RefreshScope |
---|---|---|
初始配置加载 | ✅ 成功 | ✅ 成功 |
修改配置后调用 /actuator/refresh | ❌ 无变化 | ✅ 生效 |
方法调用时是否每次都检查配置 | ❌ 否 | ✅ 是 |
内存占用 | 较低 | 略高(因代理对象) |
性能影响 | 无 | 微乎其微(仅在首次调用时检查) |
分析结论:
- 对于不需要频繁更改的配置项,建议使用普通
@Component
。 - 对于需要动态调整的业务参数(如限流阈值、开关标志等),应优先使用
@RefreshScope
。 - 由于
@RefreshScope
基于代理机制,因此不能直接应用于final
类或final
方法。 - 结合 Spring Cloud Bus 可实现跨服务广播式刷新通知,适用于集群环境。
六、总结
@RefreshScope
和 @Component
在 Spring Cloud 中各自承担不同的职责,但它们可以协同工作,共同构建一个灵活、可扩展的配置管理体系:
@Component
负责 Bean 的自动注册;@RefreshScope
赋予 Bean 动态刷新的能力;- 二者结合可以实现“按需刷新”,提升系统的响应能力和灵活性。
在实际项目中,合理使用这两个注解,可以显著降低配置变更带来的运维成本,同时增强系统的可维护性与可观测性。
相关文章:
Spring Cloud动态配置刷新:@RefreshScope与@Component的协同机制解析
在微服务架构中,动态配置管理是实现服务灵活部署、快速响应业务变化的关键能力之一。Spring Cloud 提供了基于 RefreshScope 和 Component 的动态配置刷新机制,使得开发者可以在不重启服务的情况下更新配置。 本文将深入解析 RefreshScope 与 Component…...
部署docker上的redis,idea一直显示Failed to connect to any host resolved for DNS name
参考了https://blog.csdn.net/m0_74216612/article/details/144145127 这篇文章,关闭了centos的防火墙,也修改了redis.conf文件,还是一直显示Failed to connect to any host resolved for DNS name。最终发现是腾讯云服务器那一层防火墙没…...

如何在 Windows 10 或 11 上使用命令提示符安装 PHP
我们可以在 Windows 上从其官方网站下载并安装 PHP 的可执行文件,但使用命令提示符或 PowerShell 更方便。 PHP 并不是一种新的或不为人知的脚本语言,它已经存在并被全球数千名网络开发人员使用。它以开源许可并分发,广泛用于 LAMP 堆栈中。然而,与 Linux 相比,它在 Wind…...

RK3588 ADB使用
安卓adb操作介绍 adb(Android Debug Bridge)是一个用于与安卓设备进行通信和控制的工具。adb可以通过USB或无线网络连接安卓设备,执行各种命令,如安装和卸载应用,传输文件,查看日志,运行shell命…...
Vue 3.0双向数据绑定实现原理
Vue3 的数据双向绑定是通过响应式系统来实现的。相比于 Vue2,Vue3 在响应式系统上做了很多改进,主要使用了 Proxy 对象来替代原来的 Object.defineProperty。本文将介绍 Vue3 数据双向绑定的主要特点和实现方式。 1. 响应式系统 1.1. Proxy对象 Vue3 …...

Please install it with pip install onnxruntime
无论怎么安装都是 Please install it with pip install onnxruntime 我python 版本是3.11 ,我换成3.10 解决了...
java -jar命令运行 jar包时如何运行外部依赖jar包
java -jar命令运行 jar包时如何运行外部依赖jar包 场景: 打包发不完,运行时。发现一个问题, java java.lang.NoClassDefFoundError: org/apache/commons/lang3/ArrayUtils 显示此,基本表明,没有这个依赖,如果在开发…...

低损耗高效能100G O Band DWDM 10km光模块 | 支持密集波分复用
目录 前言 一、产品概述 100G QSFP28 O Band DWDM 10km光模块核心特点包括: 二、为何选择O Band DWDM方案? 1.低色散损耗,传输更稳定 2.兼容性强 三、典型应用场景 1.数据中心互联(DCI) 2.企业园区/智慧城市组网 3.电信…...
【解决分辨数字】2021-12-16
缘由用C语言解决分辨数字-编程语言-CSDN问答 int a 0, w 0, aa[6]{};cin >> a;while (a)aa[w] a % 10, a / 10, w;cout << w << endl;while (a<w)cout << aa[a] << ends, aa[5] * 10, aa[5] aa[a];cout << endl << aa[5] <…...
el-tree结合checkbox实现数据回显
组件代码 <el-tree:data"vertiList"show-checkboxnode-key"id":props"defaultProps"ref"treeRefx"class"custom-tree"check-change"handleCheckChange"> </el-tree>获取选择的节点 handleCheckChan…...

第二十六天打卡
全局变量 global_var 全局变量是定义在函数、类或者代码块外部的变量,它在整个程序文件内都能被访问。在代码里, global_var 就是一个全局变量,下面是相关代码片段: print("\n--- 变量作用域示例 ---") global_var …...

阿里云ECS部署Dify
一:在ECS上面安装Docker 关防火墙 sudo systemctl stop firewalld 检查防火墙状态 systemctl status firewalld sudo yum install -y yum-utils device-mapper-persistent-data lvm2 设置阿里镜像源,安装并启动docker [base] nameCentOS-$releas…...
【线段树】P4588 [TJOI2018] 数学计算|普及+
本文涉及知识点 C线段树 [TJOI2018] 数学计算 题目描述 小豆现在有一个数 x x x,初始值为 1 1 1。小豆有 Q Q Q 次操作,操作有两种类型: 1 m:将 x x x 变为 x m x \times m xm,并输出 x m o d M x \bmod M…...

日志与策略模式
什么是设计模式 IT⾏业 ,为了让 菜鸡们不太拖⼤佬的后腿, 于是⼤佬们针对⼀些经典的常⻅的场景, 给定了⼀些对应的解决⽅案, 这个就是 设计模式 日志认识 计算机中的⽇志是记录系统和软件运⾏中发⽣事件的⽂件,主要作⽤是监控运⾏状态、记录异常信 息ÿ…...

Jenkins 最佳实践
1. 在Jenkins中避免调度过载 过载Jenkins以同时运行多个作业可能导致资源竞争、构建速度变慢和系统性能问题。分配作业启动时间可以防止瓶颈,并确保更顺畅的执行。如何实现? 在Cron表达式中使用H:引入抖动(jitter)&a…...

天能股份SAP系统整合实战:如何用8个月实现零业务中断的集团化管理升级
目录 天能股份SAP系统整合案例:技术驱动集团化管理的破局之路 一、企业背景:新能源巨头的数字化挑战 二、项目难点:制造业的特殊攻坚战 1. 生产连续性刚性需求 2. 数据整合三重障碍 3. 资源限制下的技术突围 三、解决方案:S…...
搜索引擎的高级语法
文章目录 精确搜索:双引号站内搜索:site通配符搜索:*减号缩小范围:-文档搜索:filetypeURL搜索: inurl标题搜索:intitle正文搜索:intext参考链接 精确搜索:双引号 “ ” …...

uniapp-商城-59-后台 新增商品(属性的选中,进行过滤展示,filter,some,every和map)
前面讲了属性的添加,添加完成后,数据库中已经存在数据了,这时再继续商品的添加时,就可以进行属性的选择了。 在商品添加过程中,属性选择是一个关键步骤。首先,界面需要展示嵌套的属性数据,用户通…...
linux用户切换
在 Linux 系统中,/etc/shadow 文件存储了用户的加密密码和其他安全相关信息,因此默认只有 root 用户 才有权限读取。当你尝试用普通用户身份查看时,会收到 Permission denied 错误。 如何查看 /etc/shadow 文件? 方法 1ÿ…...

B2C 商城转型指南:传统企业如何用 ZKmall模板商城实现电商化
在数字化浪潮席卷全球的当下,传统企业向电商转型已不再是选择题,而是关乎生存与发展的必答题。然而,缺乏技术积累、开发成本高、运营经验不足等问题,成为传统企业转型路上的 “拦路虎”。ZKmall模板商城以其低门槛、高灵活、强适配…...
鸿蒙OSUniApp 实现的二维码扫描与生成组件#三方框架 #Uniapp
UniApp 实现的二维码扫描与生成组件 前言 最近在做一个电商小程序时,遇到了需要扫描和生成二维码的需求。在移动应用开发中,二维码功能已经成为标配,特别是在电商、社交和支付等场景下。UniApp作为一个跨平台开发框架,为我们提供…...

生成树协议 - STP
目录 BPDU STP选举机制 STP端口状态 STP计时器 STP拓扑变更机制 生成树协议(Spanning Tree Protocol),简写为STP。 STP是二层网络中用于消除环路的协议,通过阻塞冗余链路,使可用链路在拓扑上呈现出无环的树结构&…...

计算机指令分类和具体的表示的方式
1.关于计算机的指令系统 下面的这个就是我们的一个简单的计算机里面涉及到的指令: m就是我们的存储器里面的地址,可以理解为memory这个意思,r可以理解为rom这样的单词的首字母,帮助我们去进行这个相关的指令的记忆,不…...

mvc-service引入
什么是业务层 1)Model1(JSP)和Model2(模糊的mvc): MVC:Model(模型),View(视图),Controller(控制器) 视图层:用于数据展示以及用户交互的界…...

基于微信小程序的城市特色旅游推荐应用的设计与实现
💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…...

【暗光图像增强】【基于CNN的方法】2020-AAAI-EEMEFN
EEMEFN:Low-Light Image Enhancement via Edge-Enhanced Multi-Exposure Fusion Network EEMEFN:基于边缘增强多重曝光融合网络的低光照图像增强 AAAI 2020 论文链接 0.论文摘要 本研究专注于极低光照条件下的图像增强技术,旨在提升图像亮度…...

【Linux】ssh命令 – 安全的远程连接服务
原创:厦门微思网络 SSH命令的概念 ssh命令的功能是安全地远程连接服务器主机系统,作为OpenSSH套件中的客户端连接工具,ssh命令可以让我们轻松地基于SSH加密协议进行远程主机访问,从而实现对远程服务器的管理工作。 语法 ssh 参…...

AT9850B—单北斗导航定位芯片
AT9850B是一款高性能低功耗双频单北斗卫星导航接收机SOC单芯片。芯片集成射频前端和数字基带、多模式卫星信号处理引擎、电源管理功能,集成度高,外围应用电路简洁。 支持中国北斗B1I/B1C单频定位或B1I/B1C/B2a双频定位,支持北斗二号和三号&a…...
【开源Agent框架】CAMEL:角色扮演+任务分解
一、项目概览:重新定义智能体协作范式 CAMEL(Communicative Agents for “Mind” Exploration of Large Language Model Society)是由camel-ai社区开发的开源多智能体框架,致力于探索智能体的规模法则(Scaling Laws)。该项目通过构建包含百万级智能体的复杂社会系统,研…...

工业4G路由器IR5000公交站台物联网应用解决方案
随着城市化进程的加速,公共交通是智慧城市的重要枢纽。城市公共交通由无数的公交站台作作为节点组合而成,其智能化升级成为提升城市出行效率与服务质量的关键。传统公交站台信息发布滞后、缺乏实时性,难以满足乘客对公交信息快速获取的需求&a…...