Lecture04-SpringCloud-Nacos配置中心

文章目录

    [toc]

    单词词性音标含义
    Data IDn./ˈdeɪtə aɪ diː/配置的唯一标识(一般 = 服务名 + 文件后缀)
    Groupn./ɡruːp/分组(把配置分组管理,默认 DEFAULT_GROUP)
    namespacen./ˈneɪmspeɪs/命名空间(环境隔离:dev / test / prod 各一套配置)
    refreshv./rɪˈfreʃ/刷新(配置修改后让运行中的服务自动拿到最新值)
    priorityn./praɪˈɒrəti/优先级(多个配置来源同时存在时,谁生效)
    sharedadj./ʃeərd/共享的(多个服务共用的公共配置)

    Lecture04-SpringCloud-Nacos配置中心

    目标:把各服务的配置集中到 Nacos,改配置不用重启服务,并掌握 Data ID、Group、命名空间、共享配置与配置优先级。

    1、为什么需要配置中心

    单体时代配置写在 application.yml 里,改一下要重启整个应用;微服务有几十个服务,逐台改配置不现实。配置中心解决:

    • 集中管理:所有服务的配置放在 Nacos 一个地方。
    • 动态刷新:改完配置,运行中的服务自动拿到新值,无需重启。
    • 环境隔离:dev / test / prod 用命名空间隔离,互不干扰。

    nacos-config

    一句话:配置中心 = 各服务的"设置面板",改完即生效。


    2、Nacos 里的三个关键概念

    概念作用示例
    Data ID一条配置的唯一名字user-service.yaml
    Group配置分组,默认 DEFAULT_GROUP一般不用改
    Namespace环境/租户隔离,各自独立dev、test、prod

    定位一条配置:Namespace + Group + Data ID 三要素唯一确定。


    3、接入配置中心

    1、加依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    

    2、配置文件中声明"引入 Nacos 配置"

    Spring Cloud 2025.1.x 用 spring.config.import 方式引入 Nacos 配置(注意:声明了 import 后,Nacos 里没有对应配置启动会报错):

    spring:
      application:
        name: user-service
      config:
        import:
          - nacos:user-service.yaml        # 引入 Data ID = user-service.yaml
      cloud:
        nacos:
          server-addr: 192.168.100.100:8848
          config:
            file-extension: yaml           # 后缀(与 import 里的后缀一致)
    

    提示:为避免"import 的配置不存在就启动失败",可在 Nacos 里先建一条空配置 user-service.yaml。


    3、在 Nacos 里建配置

    控制台 → 配置管理 → 配置列表 → 新建配置:

    • Data ID:user-service.yaml
    • Group:DEFAULT_GROUP
    • 格式:YAML
    • 内容:例如
    app:
      slogan: 来自Nacos配置中心的问候
      max-users: 1000
    

    4、动态刷新 @RefreshScope

    想让配置改了立即生效,在被注入的类上加 @RefreshScope:

    @RestController
    @RefreshScope          // 关键:配置变更时重建当前 Bean,读最新值
    public class ConfigController {
    
        @Value("${app.slogan:默认}")
        private String slogan;
    
        @Value("${app.max-users:0}")
        private int maxUsers;
    
        @GetMapping("/config")
        public String show() {
            return "slogan=" + slogan + ", maxUsers=" + maxUsers;
        }
    }
    

    演示:在 Nacos 里改 app.slogan 并发布,不重启应用,GET /config 立刻返回新值。

    注意:@RefreshScope 只对"Bean 级别"生效;静态字段、常量等不受控制。读取频繁的热点配置可结合 Redis 缓存(衔接 Redis 课)。

    注意:@Value("${app.slogan:默认}")中的默认值非常有用!先让默认值在创建类的 bean 对象时能够给成员变量赋值,否则此时还无法从 Nacos 配置中心拉取配置数据,先保证当前微服务能够完成初始化,然后再从 Nacos 拉取配置更新成员变量的值!

    提问:什么数据适合放在 Nacos 配置中心管理,什么数据适合放在 Redis 中维护?

    回答:业务数据、高频读写的适合放在 Redis;微服务本身的配置信息、不经常修改的适合放在 Nacos 中。


    5、共享配置与配置优先级

    1、共享配置(多服务复用)

    把公共配置(如 Redis、消息、日志级别)抽成独立 Data ID,多个服务都引入:

    spring:
      config:
        import:
          - nacos:user-service.yaml        # 本服务专有配置
          - nacos:common-db.yaml           # 公共配置:数据库
          - nacos:common-redis.yaml        # 公共配置:Redis
    

    2、配置优先级(本课程结论,从上到下越来越高)

    本地 application.yml(最低,仅兜底)
       ↓
    Nacos 共享配置(common-*.yaml)
       ↓
    Nacos 本服务 Data ID(user-service.yaml)  ← 一般在这层配业务项
    

    实际生效顺序以 Spring 官方文档为准;业务开发记住:Nacos 里"本服务 Data ID"的配置优先级高于本地与共享配置即可。


    6、课堂练习

    1. 给 user-service 接入 Nacos 配置中心,从 Nacos 读取 app.slogan 并显示。
    2. 改 app.slogan 并发布,验证 @RefreshScope 动态刷新(不用重启)。
    3. 建一条共享配置 common-redis.yaml(放 Redis 连接项),让两个服务都引入。
    4. (挑战)新建命名空间 dev,在 dev 命名空间下建一条与默认命名空间同名配置,观察环境隔离效果。

    7、本讲小结

    • Nacos Config 集中管理配置,改完即生效(配合 @RefreshScope)。
    • 一条配置用 Namespace + Group + Data ID 唯一定位。
    • 接入方式:spring.config.import: nacos:<DataID>。
    • 公共配置用共享 Data ID 复用;"本服务 Data ID"配置优先级最高。

    8、本节验证

    • 理解配置中心的作用(统一管理、动态刷新)✅
    • 掌握 Data ID / Group / Namespace 三个关键概念 ✅
    • 会接入 Nacos 配置中心并在 Nacos 里建配置 ✅
    • 会用 @RefreshScope 实现动态刷新,理解共享配置与配置优先级 ✅
    end