背景

本文是《Java 后端从小白到大神》修仙系列之框架学习,Spring Cloud 微服务实战系列的 第二篇。Spring Cloud 是构建微服务架构的基石,拥有完整的服务治理生态,在云原生架构中广泛应用。本系列将从架构认知到实际工程,逐步构建一套企业级 Spring Cloud 微服务项目。若想详细学习请点击首篇博文开始,现在开始学习。

文章概览

配置中心统一管理与多环境支持:

  1. Nacos 简介与安装
  2. 配置中心使用原理(Nacos Config)
  3. bootstrap.yml 与 application.yml 的加载机制
  4. 多环境隔离实战(Namespace + Group)
  5. 动态刷新配置:@RefreshScope 的使用
  6. 企业级多服务配置策略建议

1. Nacos 简介与安装

  • 阿里开源的服务发现与配置中心
  • 统一替代 Eureka + Config + Bus

安装方式

  • 推荐使用 Docker:
1
2
3
4
5
6
7
nacos:
  image: nacos/nacos-server
  ports:
    - "8848:8848"
    - "9848:9848"
  environment:
    - MODE=standalone

访问:http://localhost:8848/nacos 默认账号密码:nacos / nacos

2. 配置中心使用原理(Nacos Config)

服务启动时会自动从 Nacos 读取远程配置内容,并注入到 Spring 环境中,优先级高于本地 application.yml。Nacos 配置本质就是远程的 yml 文件,配置文件被拉取后,参与了合并到application.yml ,等价于本地的 application.yml 内容。

配置项组成如下:

  • Data ID: 通常命名为 ${spring.application.name}-${profile}.yaml

  • Group: 默认 DEFAULT_GROUP,也可自定义

  • Namespace: 用于多环境隔离(如 dev、test、prod)

  • 服务启动后通过 HTTP 注册到 Nacos

  • 服务列表保存在注册中心

  • 服务间通过服务名调用(而非 IP)

3. 服务注册配置(Spring Boot 3)

文件名 加载时机 作用
bootstrap.yml Spring Boot 初始化前 用于Spring Cloud 组件的初始化配置,常用于加载Nacos配置中心相关配置
application.yml Spring Boot 初始化中 本地服务配置(端口、数据库、日志等)

注意:Spring Boot 3 后期支持通过 application.ymlspring.config.import 加载远程配置,bootstrap.yml 仍不可完全删除,除非你将配置中心导入写在 application.yml 中且不引用任何远程变量提前使用。

1
2
3
4
5
6
7
8
9
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

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

application.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
server:
  port: 8888

spring:
  application:
    name: config-service
  config:
    import: nacos:config-service-dev.yaml?namespace=47bd187a-3446-43a7-8a56-573dc8abc147&serverAddr=127.0.0.1:8848
  
  cloud:
    nacos:
      discovery:
        namespace: 47bd187a-3446-43a7-8a56-573dc8abc147 # Nacos DEV 命名空间

management:
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    refresh:
      enabled: true

bootstrap.yml:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
spring:
  application:
    name: config-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        namespace: 47bd187a-3446-43a7-8a56-573dc8abc147
        group: DEFAULT_GROUP
      discovery:
        namespace: 47bd187a-3446-43a7-8a56-573dc8abc147

4. 多环境隔离实战(Namespace + Group)

在 Nacos 控制台创建命名空间:

  • 名称:开发环境
  • ID(系统生成):47bd187a-3446-43a7-8a56-573dc8abc147

然后配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# application.yml
server:
  port: 8888

spring:
  application:
    name: config-service
  config:
    import: nacos:config-service-dev.yaml?namespace=47bd187a-3446-43a7-8a56-573dc8abc147&serverAddr=127.0.0.1:8848

  cloud:
    nacos:
      discovery:
        namespace: 47bd187a-3446-43a7-8a56-573dc8abc147

说明:

  • config.import: 表示从 Nacos 加载远程配置
  • namespace: 区分 dev/test/prod 的关键
  • Nacos 控制台需提前创建对应的 Data ID,如:config-service-dev.yaml

5. 动态刷新配置 @RefreshScope 的使用

在需要动态刷新的配置 Bean 上添加注解:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@RefreshScope
@Component
public class MyConfigPrinter {
    @Value("${config.title}")
    private String title;

    @PostConstruct
    public void init() {
        System.out.println(">>> config.title = " + title);
    }
}

修改 Nacos 配置后,发送刷新请求:

1
curl -X POST http://localhost:8888/actuator/refresh

控制台输出即会变更。

成功拉取配置的日志标志:

1
[Nacos Config] Load config[dataId=config-service-dev.yaml, group=DEFAULT_GROUP] success

6. 企业级多服务配置策略建议

方式 说明
按服务拆分配置 每个服务独立一个 Data ID,便于维护
使用 profile 区分 xxx-dev.yamlxxx-prod.yaml 命名
配置加密支持 使用 KMS、SM4 等加密敏感配置
配置审计 配置变更记录、修改人、时间等审计

总结

使用 Nacos 配置中心可以显著提升微服务架构下配置管理的集中性、灵活性和安全性。配合 @RefreshScope 实现配置的动态刷新,大幅降低维护成本。