背景

本文整理一下微服务配置体系中最常见、也最容易混淆的部分:Spring Boot 配置文件优先级Nacos 配置加载机制的配合问题。

下面是一个详细的对比与整理表格,涵盖这几类配置文件,按优先级和作用说明:

1. Spring Boot + Nacos 配置体系优先级与加载顺序对比表

优先级 文件/配置类型 作用范围 加载时机 加载方式 说明与推荐用途
1️⃣ 命令行参数 / 环境变量 所有(可覆盖任意配置) 应用启动前 由操作系统或命令行传入 优先级最高,适用于临时覆盖配置,如:--server.port=8081。CI/CD 环境常用。
2️⃣ application-<profile>.yml(本地) 本地环境特定配置 应用加载配置时 本地文件 比 application.yml 高,适合按环境设置端口、数据源等。用于开发环境调试非常方便。
3️⃣ Nacos 配置(如 user-service-dev.yaml 服务对应环境的远程配置 bootstrap 拉取后 远程加载(服务名 + profile 匹配) 推荐主要通过它配置各服务 prod/dev 参数,集中管理,替代本地 application.yml
4️⃣ 本地 application.yml / .properties 应用默认配置 Spring 加载配置阶段 本地文件 若无 Nacos,可放置数据库连接等基本配置。开发环境可依赖它,生产环境建议弱化使用。
5️⃣ Nacos shared-common.yaml 所有服务共享通用配置 bootstrap 加载后 远程加载 via shared-configs Redis、RabbitMQ、Zipkin 通用配置。优先级低,适用于全局统一配置。可被服务配置覆盖。
6️⃣ bootstrap.yml / .properties(本地) 配置中心地址、命名空间等初始化 最早加载 本地文件 必须配置 Nacos 的 server-addr、namespace 等。只做初始化,不参与业务配置值。
7️⃣ docker-compose.yml 容器启动配置 Docker 执行前 Docker 工具解析 与 Spring Boot 无关,控制容器网络、主机名、端口映射等。决定 RabbitMQ、MySQL 的 hostname。

2. 加载优先级总结图示

1 高 → 7 低

1
2
3
4
5
6
7
1. 命令行参数 / 环境变量(最高优先级)
2. 本地 application-<profile>.yml
3. Nacos: user-service-dev.yaml(远程主配置,通过bootstrap配置文件拉取)
4. 本地 application.yml(默认配置)
5. Nacos: shared-common.yaml(远程共享配置)
6. 本地 bootstrap.yml(用于连接配置中心,配置本身不会参与业务)
7. docker-compose.yml(不属于 Spring 配置体系)

3. 配置文件实践建议

  • 本地开发 → 用 application-dev.yml
  • 远程部署 → 主要依赖 Nacos 的 <service>-<profile>.yaml
  • 公共配置 → 放 shared-common.yaml
  • 不可缺的配置(Nacos 地址等) → 写入 bootstrap.yml
  • 临时修改 → 用命令行参数,如 --spring.rabbitmq.host=xxx

4. Docker 环境变量

指的就是 docker-compose.yml 中每个服务的 environment: 配置。

完整示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
auth-service:
  image: auth-service
  container_name: auth-service
  ports:
    - "9000:9000"
  depends_on:
    - nacos
    - mysql
  networks:
    - cloudtask-net
  restart: always
  environment:
    SPRING_PROFILES_ACTIVE: dev         # 👈 加上这个
    MANAGEMENT_ZIPKIN_TRACING_ENDPOINT: http://zipkin:9411/api/v2/spans
    MANAGEMENT_TRACING_SAMPLING_PROBABILITY: "1.0"
    MANAGEMENT_TRACING_ENABLED: "true"

为所有服务加上 SPRING_PROFILES_ACTIVE

像这样分别添加:

服务名 建议配置
auth-service SPRING_PROFILES_ACTIVE: dev
user-service SPRING_PROFILES_ACTIVE: dev
task-service SPRING_PROFILES_ACTIVE: dev
gateway-service SPRING_PROFILES_ACTIVE: dev

将来要切换为生产环境时,只需把这些值从 dev 改为 prod,重新部署即可。

总结

从此对配置文件的优先级有了一个认识。