当前位置: 首页 > news >正文

分布式微服务--Nacos作为配置中心(补)关于bosststrap.yml与@RefreshScope

一、关于bosststrap.yml

bootstrap.ymlapplication.yml 的区别

对比项bootstrap.ymlapplication.yml
加载时机优先于 application.yml 加载(启动早期)程序初始化完成后加载
主要用途设置应用的外部配置源注册中心信息设置应用内部配置,如端口、日志级别、bean 配置等
使用场景需要在程序启动早期就完成配置加载的情况常规配置


✅ Nacos 配置中心为什么推荐用 bootstrap.yml

Spring Cloud Alibaba 的配置加载机制,是基于 Spring Cloud Config 客户端架构实现的,读取远程配置的行为是发生在应用上下文启动之前

🚨 也就是说:如果你把 Nacos 的配置写到 application.yml,此时还没加载配置中心,自然就读取不到远程配置。

所以要写到 bootstrap.yml


✅ 实际建议(记住这个就行):

凡是涉及到外部配置源(如 Nacos 配置中心、Spring Cloud Config Server、Apollo 等)的信息,必须写在 bootstrap.yml 中。

比如这些字段:

spring:application:name: nacos-config-democloud:nacos:config:server-addr: 127.0.0.1:8848file-extension: yaml

✅ Spring Boot 3.x 的变化(附加知识)

从 Spring Boot 2.4 开始,引入了一个新的配置机制叫做 config 子系统,官方推荐使用 application.yml + configimport 替代 bootstrap.yml

比如你可以写成:

spring:config:import: nacos:nacos-config-demo.yaml

但目前大多数 Spring Cloud Alibaba 项目依旧推荐 bootstrap.yml,特别是 Spring Boot 2.x 的项目。

一、@RefreshScope注解

✅为什么需要 @RefreshScope

在使用 Nacos 作为配置中心时,我们常常希望在不重启服务的情况下,动态刷新配置项的值。Spring Cloud 提供了 @RefreshScope 注解来实现这个需求。

默认情况下,Spring 容器中注入的配置值(如通过 @Value@ConfigurationProperties)在应用启动后就被固定了,即使 Nacos 中的配置发生了变更,也不会自动刷新,除非重启服务。

因此:

@RefreshScope 的作用就是:
让被注解的类或 Bean 在配置变更时,能够自动重新加载最新的配置,实现配置的热更新。


✅加在哪里?

1. 用在配置类上(推荐)
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "user")
public class UserConfig {private String name;private Integer age;// 省略 getter/setter
}

此时,如果 Nacos 中 user.nameuser.age 的配置发生变更,该类会自动重新加载配置。

2. 用在使用 @Value 的类上
@RestController
@RefreshScope  // 必须加在类上
public class UserController {@Value("${user.name}")private String name;@GetMapping("/user/name")public String getName() {return name;}
}

注意:如果你用的是 @Value必须加在类上才会生效。加在字段上无效!


✅ 配合使用的前提

要使 @RefreshScope 生效,还需确保:

  1. Nacos 配置变更时已开启 自动刷新refresh: true)。

  2. 引入了必要依赖(Spring Cloud Alibaba Nacos Config)。

  3. 项目中引入了 Spring Boot Actuator,并暴露了 /actuator/refresh 接口(对于手动刷新场景)。

http://www.dtcms.com/a/311020.html

相关文章:

  • 分布式微服务--Nacos作为配置中心(二)
  • 多线程(一) ~ 进程与线程的区别
  • 深入 Go 底层原理(五):内存分配机制
  • 基于ELK Stack的实时日志分析与智能告警实践指南
  • 【vue】创建响应式数据ref和reactive的区别
  • React ahooks——副作用类hooks之useDebounceFn
  • Coze Studio 概览(六)--知识库管理
  • FreeRTOS源码分析一:task启动(RISCV架构)
  • 再见!三层框架开发
  • 【无标题】根据11维拓扑量子色动力学模型的严格计算宇宙轮回次数:
  • 谈谈WebAssembly、PWA、Web Workers的作用和场景
  • 论文阅读笔记:Dataset Condensation with Gradient Matching
  • 2023年影响重大的网络安全典型案例
  • OAuth 2.0 的安全升级版授权协议 OAuth 2.1 详解
  • 企业级单点登录(SSO)技术详解:从原理到安全实践
  • 华为核心交换机S7700的内存OID
  • k8s使用 RBAC 鉴权
  • 最新Windows11系统镜像,23H2 64位ISO镜像
  • Kafka——关于Kafka动态配置
  • 【MATLAB】(五)向量与多项式
  • 能力显著性向量:验证损失与下游能力的缩放定律
  • fastGEO v1.7.0 大更新,支持PCA、差异分析、火山图、热图、差异箱线图、去批次等分析
  • 二叉树算法之【Z字型层序遍历】
  • Lock 接口及实现类详解:从 ReentrantLock 到并发场景实践
  • Java web(02)
  • Javascript面试题及详细答案150道之(016-030)
  • kong网关集成Safeline WAF 插件
  • 排序算法大全:从插入到快速排序
  • 通过解决docker network connect实现同一个宿主机不同网络的容器间通信
  • 深入理解 Docker 容器网络:为什么用 host 网络模式能解决连通性问题?