Skip to content

Nacos

Nacos 同时提供服务发现和配置管理。Spring Cloud Alibaba 分别通过 nacos-discoverynacos-config Starter 接入,两种能力可以独立使用。

资源模型

text
Namespace
└── Group
    └── Service
        └── Cluster
            └── Instance
对象作用
Namespace隔离环境、租户或业务域
Group在 Namespace 内继续组织服务和配置
Service服务发现的订阅单位
ClusterService 下的地域、机房或部署单元
Instance实际服务端点及其元数据、权重和健康状态

Namespace 是强隔离边界,客户端必须使用 Namespace ID,而不是控制台显示名称。Group 适合组织数据,不应代替 Namespace 承担环境安全隔离。

服务发现

服务提供者启动后通过 Spring Cloud ServiceRegistry 注册实例;消费者按服务名订阅实例列表,再由 Spring Cloud LoadBalancer 选择目标实例。

Nacos 回答“某服务有哪些可用实例”,不负责调用超时、重试、熔断、鉴权和链路追踪。权重、Cluster 和元数据选择器属于发现侧路由信息,也不等于完整流量治理。

接入服务发现

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

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
yaml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
      username: ${NACOS_USERNAME}
      password: ${NACOS_PASSWORD}
      discovery:
        namespace: ${NACOS_NAMESPACE}
        group: DEFAULT_GROUP
        cluster-name: zone-a
    loadbalancer:
      nacos:
        enabled: true

现代 Spring Cloud 使用 Spring Cloud LoadBalancer,不再使用 Ribbon 的 NFLoadBalancerRuleClassName。是否需要显式 @EnableDiscoveryClient 取决于所用 Spring Cloud 版本和自动配置;通常引入实现并完成配置即可,不应把注解当作服务发现生效的唯一条件。

临时与持久实例

类型健康语义常见场景
临时实例依赖客户端连接或心跳,失联后可被删除生命周期随进程变化的普通服务实例
持久实例服务端保留实例记录并主动探测需要保留注册信息的固定基础设施

不能把临时实例简单写成“AP”、持久实例简单写成“CP”,更不能推断存在持久实例时整个 Nacos 集群自动切换一致性模式。应分别理解注册数据类型、健康检查方式以及 Nacos 版本采用的协议实现。

配置管理

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

Spring Cloud Alibaba 2025.x 使用 Spring Boot Config Data API:

yaml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848}
      username: ${NACOS_USERNAME}
      password: ${NACOS_PASSWORD}
      config:
        namespace: ${NACOS_NAMESPACE}
        group: DEFAULT_GROUP
  config:
    import:
      - nacos:order-service.yaml?refreshEnabled=true
      - optional:nacos:shared.yaml?group=COMMON_GROUP&refreshEnabled=true
  • nacos: 拉取失败会阻止应用启动,适合必需配置。
  • optional:nacos: 拉取失败仍允许启动,只适合确实有本地默认值的配置。
  • refreshEnabled=true 开启该 Data ID 的动态刷新。
  • 2025.1.x 已不再支持通过 bootstrap.yml 接入 Nacos。
  • shared-configsextension-configs 和隐式按应用名加载已被弃用,应显式列出 spring.config.import

动态刷新不代表任意 Bean 都会安全热更新。@ConfigurationProperties 更适合成组配置;需要重新创建 Bean 时使用 @RefreshScope,并评估连接池、线程池和状态对象在刷新过程中的一致性。

配置优先级与治理

配置优先级取决于 Spring Environment 中 PropertySource 的装载顺序以及各 Import 的声明顺序,不能继续使用“服务名-profile > 服务名 > 本地配置”作为通用结论。重要配置应通过受保护的诊断端点验证最终来源。

  • Data ID 显式包含应用、环境和用途,避免隐式加载。
  • 密码、Token 和私钥优先使用 Secret 管理系统,不把 Nacos 当作默认密钥保险箱。
  • 配置变更需要权限、审计、灰度、校验和回滚。
  • 删除或修改配置前评估监听客户端,避免一次推送引发集群级重启或雪崩。

高可用与安全

  • 生产 Nacos 部署多个节点,客户端或负载均衡地址覆盖故障切换。
  • Nacos Server 的元数据存储、高可用方式和端口随大版本变化,应按部署模式查阅对应文档。
  • 禁止使用默认账号密码,启用认证并限制控制台、OpenAPI 和集群端口访问。
  • 监控注册数、健康实例数、推送失败、配置监听、请求延迟、JVM、数据库和磁盘。
  • 客户端获取实例失败时使用旧缓存属于可用性策略,必须配合过期时间和端到端调用失败监控。