Nacos
Nacos 同时提供服务发现和配置管理。Spring Cloud Alibaba 分别通过 nacos-discovery 与 nacos-config Starter 接入,两种能力可以独立使用。
资源模型
Namespace
└── Group
└── Service
└── Cluster
└── Instance| 对象 | 作用 |
|---|---|
| Namespace | 隔离环境、租户或业务域 |
| Group | 在 Namespace 内继续组织服务和配置 |
| Service | 服务发现的订阅单位 |
| Cluster | Service 下的地域、机房或部署单元 |
| Instance | 实际服务端点及其元数据、权重和健康状态 |
Namespace 是强隔离边界,客户端必须使用 Namespace ID,而不是控制台显示名称。Group 适合组织数据,不应代替 Namespace 承担环境安全隔离。
服务发现
服务提供者启动后通过 Spring Cloud ServiceRegistry 注册实例;消费者按服务名订阅实例列表,再由 Spring Cloud LoadBalancer 选择目标实例。
Nacos 回答“某服务有哪些可用实例”,不负责调用超时、重试、熔断、鉴权和链路追踪。权重、Cluster 和元数据选择器属于发现侧路由信息,也不等于完整流量治理。
接入服务发现
<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>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 版本采用的协议实现。
配置管理
<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:
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=truenacos:拉取失败会阻止应用启动,适合必需配置。optional:nacos:拉取失败仍允许启动,只适合确实有本地默认值的配置。refreshEnabled=true开启该 Data ID 的动态刷新。- 2025.1.x 已不再支持通过
bootstrap.yml接入 Nacos。 shared-configs、extension-configs和隐式按应用名加载已被弃用,应显式列出spring.config.import。
动态刷新不代表任意 Bean 都会安全热更新。@ConfigurationProperties 更适合成组配置;需要重新创建 Bean 时使用 @RefreshScope,并评估连接池、线程池和状态对象在刷新过程中的一致性。
配置优先级与治理
配置优先级取决于 Spring Environment 中 PropertySource 的装载顺序以及各 Import 的声明顺序,不能继续使用“服务名-profile > 服务名 > 本地配置”作为通用结论。重要配置应通过受保护的诊断端点验证最终来源。
- Data ID 显式包含应用、环境和用途,避免隐式加载。
- 密码、Token 和私钥优先使用 Secret 管理系统,不把 Nacos 当作默认密钥保险箱。
- 配置变更需要权限、审计、灰度、校验和回滚。
- 删除或修改配置前评估监听客户端,避免一次推送引发集群级重启或雪崩。
高可用与安全
- 生产 Nacos 部署多个节点,客户端或负载均衡地址覆盖故障切换。
- Nacos Server 的元数据存储、高可用方式和端口随大版本变化,应按部署模式查阅对应文档。
- 禁止使用默认账号密码,启用认证并限制控制台、OpenAPI 和集群端口访问。
- 监控注册数、健康实例数、推送失败、配置监听、请求延迟、JVM、数据库和磁盘。
- 客户端获取实例失败时使用旧缓存属于可用性策略,必须配合过期时间和端到端调用失败监控。