配置中心:Nacos Config 使用与多环境
服务一多,配置管理立刻变难:同一份配置散落在几十个工程的 yml 里,改一个参数要全量发布;dev/test/prod 的环境差异全靠手工维护。配置中心把配置从代码里"抽出来"集中管理,并支持动态下发。Nacos 注册中心与配置中心一体,本章继续沿用第 03 章部署的 Nacos Server。
为什么要独立配置中心
集中管理(一处修改、多处生效)、环境隔离(dev/test/prod 各一套)、动态刷新(第 12 章)、权限与审计(谁能改、何时改)是配置中心的四大价值。需要说明的是,工程里仍会保留 application.yml,只是把"随环境变化的、可能需要动态调整的"配置搬到 Nacos,二者职责分离。
引入依赖
在需要接入配置的工程(以 order-service 为例)中引入:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
用 spring.config.import 接入
新版 Spring Cloud Alibaba 推荐在 application.yml 里用 config import 方式声明要加载的 Nacos 配置,optional 表示 Nacos 不可用时本地仍可启动(便于本地开发):
spring:
application:
name: order-service
config:
import: optional:nacos:order-service.yaml
cloud:
nacos:
config:
server-addr: localhost:8848
file-extension: yaml
dataId 的默认命名规则是 {spring.application.name}.{file-extension},上例即读取 dataId 为 order-service.yaml 的配置。老资料里常见的 bootstrap.properties + spring-cloud-starter-bootstrap 方案属于历史兼容路径,新工程优先使用 config import。
多环境:profile 与命名空间
两种常用隔离手段,可叠加使用:
- Profile:激活 profile 后优先读取 {name}-{profile}.{file-extension},例如激活 prod 时先读 order-service-prod.yaml 再读 order-service.yaml,前者覆盖后者同名键。用 spring.profiles.active 切换。
- 命名空间(namespace):在 Nacos 控制台按 dev/test/prod 各建一个命名空间,客户端通过 spring.cloud.nacos.config.namespace 指向对应命名空间的 ID,实现物理隔离,适合"同一套 Nacos 服务多环境共用"的部署。
推荐组合:环境差异用命名空间或 profile 表达,公共配置用共享配置,避免每个环境维护一份几乎相同的文件。
共享配置
多个服务都要读的公共配置(Redis 地址、公共开关)用 shared-configs 引入:
spring:
cloud:
nacos:
config:
shared-configs:
- data-id: common.yaml
group: DEFAULT_GROUP
refresh: true # 公共配置也支持动态刷新
注意老版本资料里的 extension-configs 已被 shared-configs 取代,写法以当前官方文档为准。同名配置的覆盖优先级需要结合具体接入方式确认,建议工程内做一次实测记录,避免"本地改了半天不生效"的困惑。
在控制台发布配置
登录 Nacos 控制台,在"配置管理/配置列表"中新建 dataId 为 order-service.yaml 的配置,内容为 YAML 格式,如 timeout: 5000。应用启动时会拉取该配置,通过 @Value("${timeout:5000}") 即可读取。控制台提供历史版本与回滚能力,改错配置可以快速还原,这是"配置即代码"之外的重要安全网。
小结
接入 Nacos Config 只需三步:加依赖、配 server-addr 与 dataId、在控制台发布配置。多环境用 profile/命名空间组织,公共配置走 shared-configs。配置中心真正的杀手锏是"改了立即生效",下一章详细讲动态刷新的原理与边界。