Skip to content
第 15 章 ⏱ 12 分钟阅读

第 15 章:Nacos 配置中心 ​

学习目标 ​

  • 启动 Nacos Server
  • 在 Nacos 控制台发布配置
  • Spring Boot 动态读取 + 自动刷新
  • 掌握 namespace / group / dataId 体系

一、Nacos 是什么 ​

Nacos(Naming + Configuration Service)是阿里开源的服务发现 + 配置中心,Spring Cloud Alibaba 默认组件。

两个核心功能:

  • 配置中心:集中管理配置,支持动态刷新
  • 注册中心:服务注册与发现(下章讲)

二、安装 ​

bash
docker run -d --name nacos \
  -p 8848:8848 -p 9848:9848 \
  -e MODE=standalone \
  -e JVM_XMS=256m -e JVM_XMX=256m \
  nacos/nacos-server:v2.3.1

访问 http://localhost:8848/nacos,默认账号 nacos / nacos。

⚠️ 坑 1:Nacos 2.x 多了 9848 / 9849 端口(GRPC),记得开,不然客户端连不上。

三、核心概念 ​

概念含义
Namespace命名空间,最强隔离(不同环境用不同 namespace)
Group分组,中等隔离(订单/支付/会员分组)
DataId配置集 ID,最细粒度(每个配置文件一份)

经典实践:

text
namespace = dev / test / prod
group      = DEFAULT_GROUP / ORDER_GROUP
dataId     = application.yaml / order-service.yaml

四、发布配置 ​

在 Nacos 控制台:

  1. 创建 Namespace:dev
  2. 在 dev 下新建配置:
    • DataId:order-service.yaml
    • Group:DEFAULT_GROUP
    • 配置内容:
      yaml
      order:
        timeout: 5000
        retry: 3

五、Spring Boot 整合 ​

依赖 ​

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

bootstrap.yml(注意是 bootstrap,不是 application) ​

yaml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: localhost:8848
      namespace: dev                              # 命名空间 ID
      group: DEFAULT_GROUP
      file-extension: yaml
      refresh-enabled: true                       # ⚠️ 开启自动刷新

⚠️ 坑 2:spring-cloud-starter-alibaba-nacos-config 必须用 bootstrap.yml,且加 spring-cloud-starter-bootstrap 依赖(Spring Cloud 2020+ 需要手动加)。

读取配置 ​

java
@RestController
@RefreshScope    // ⚠️ 关键注解,配置变更自动刷新
public class OrderController {

    @Value("${order.timeout:3000}")     // 默认值
    private Integer orderTimeout;

    @GetMapping("/timeout")
    public Integer getTimeout() {
        return orderTimeout;
    }
}

⚠️ 坑 3:不加 @RefreshScope,改 Nacos 配置不会生效(值是启动时缓存的)。

配置对象 ​

java
@Data
@Component
@ConfigurationProperties(prefix = "order")
@RefreshScope
public class OrderProperties {
    private Integer timeout;
    private Integer retry;
}

六、多环境管理 ​

yaml
# bootstrap.yml
spring:
  profiles:
    active: dev
  cloud:
    nacos:
      namespace: ${spring.profiles.active}

启动时加 --spring.profiles.active=prod 自动切到 prod namespace。

⚠️ 坑 4:namespace 用命名空间 ID(不是名称),UUID 形式。在控制台"命名空间"页面复制。

七、配置监听 ​

java
@NacosValue(value = "${order.timeout:3000}", autoRefreshed = true)
private Integer orderTimeout;

// 或者用 NacosConfigListener 监听变更
@NacosConfigListener(dataId = "order-service.yaml")
public void onChange(String newConfig) {
    log.info("新配置:{}", newConfig);
}

八、配置回滚 ​

Nacos 控制台 → 配置列表 → "历史版本" → 一键回滚。

或者用 OpenAPI:

bash
curl -X POST "http://localhost:8848/nacos/v1/cs/history/config" \
  -d "dataId=order-service.yaml&group=DEFAULT_GROUP&namespaceId=dev"

九、注意事项 ​

场景建议
敏感配置(密码)用 Nacos 加密插件 / Vault,不要明文
配置变更审计开启 Nacos 操作日志
大配置拆分多个 DataId,按需加载
启动依赖配置加 @DependsOn 或默认值,避免启动失败

⚠️ 坑 5:Nacos 配置强依赖网络,启动时连不上会启动失败。生产必须配 spring.cloud.nacos.config.timeout 重试。

十、本章小结 ​

要点关键
三层隔离Namespace → Group → DataId
bootstrap.yml客户端配置入口
@RefreshScope实现动态刷新
命名空间用 ID 不是名称
多环境profiles + namespace 切换
启动失败Nacos 不可用会导致应用启动失败,生产必配重试

动手练习 ​

  1. 用 Docker 启动 Nacos,创建 dev namespace
  2. 发布 order-service.yaml,Spring Boot 应用读 order.timeout
  3. 改 Nacos 配置,验证 @RefreshScope 自动刷新(看日志)

下一章:第 16 章:Nacos 注册中心 →

本站基于 VitePress 构建 · 由 StackHub 团队维护