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

一、关于bosststrap.yml

✅ bootstrap.yml 和 application.yml 的区别

对比项 bootstrap.yml application.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 中。

比如这些字段:

java 复制代码
spring:
  application:
    name: nacos-config-demo
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml

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

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

比如你可以写成:

java 复制代码
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. 用在配置类上(推荐)
java 复制代码
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "user")
public class UserConfig {
    private String name;
    private Integer age;
    // 省略 getter/setter
}

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

2. 用在使用 @Value 的类上
java 复制代码
@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 接口(对于手动刷新场景)。

相关推荐
松仔log31 分钟前
Kotlin中级——callbackFlow
java·前端·kotlin
知守观1 小时前
同一个团队两套分包:DDD 四层落地后,domain 层最大的类还是 5885 行
java·后端·领域驱动设计
Dawson Zhu1 小时前
【LLM推理与Serving⑨】业务模型推理引擎开发:以BEV自动驾驶为例的专用推理实践
人工智能·语言模型·架构·aigc·agi
文丑颜不良啊1 小时前
LeetCode2541~2560题目解析
java·leetcode
Anymous1 小时前
我手写的 Redis 锁,输给了 10 秒的 TTL
后端·架构
瑞雪兆丰年兮2 小时前
JavaWeb-day11-SpringBootWeb案例(文件上传)
java·运维·服务器·javaweb·oss
Lansonli2 小时前
大数据Spark(八十七):Spark-Submit 参数详解
大数据·分布式·spark
Highcharts.js2 小时前
Highcharts智能数据分析平台Orbit 多语言配置技术文档
java·前端·javascript·highcharts·orbit·智能数据分析·设置文档
Rain的Java大神之路2 小时前
设计一套生产级 API 接口:从契约、安全、幂等到限流,我踩过的坑都在这了
java·后端·面试
SimonKing2 小时前
零配置也能白嫖前沿大模型!dsh-our-free-model插件真香警告
java·后端·程序员