9.4.2 注册中心数据模型与命名空间/分组/集群
本节解释 Nacos 注册中心数据模型,以及 Namespace/Group/Cluster 的层级关系与使用场景,并给出可执行示例与排错要点。
原理草图:数据模型层级
概念与层级关系(精要)
- Namespace:最高层隔离单元,面向租户或大环境隔离。
- Group:同一命名空间内的逻辑分组,多环境/业务线区分。
- Service:服务名 + 分组 + 命名空间构成唯一标识。
- Cluster:服务下的部署单元(机房/可用区/资源池)。
- Instance:服务具体实例(IP、端口、权重、健康状态)。
示例:用命令行注册与发现(基于 Nacos OpenAPI)
预设 Nacos 运行在
127.0.0.1:8848,命名空间dev。
若未创建命名空间,可先用控制台创建并记下 namespaceId。
1)注册两个实例到同一服务、不同集群
# 变量准备
NACOS_ADDR="http://127.0.0.1:8848"
NAMESPACE_ID="dev-namespace-id" # 控制台获取
SERVICE="user-service"
GROUP="DEFAULT_GROUP"
# 注册实例到 bj 集群
curl -s -X POST "${NACOS_ADDR}/nacos/v1/ns/instance" \
-d "serviceName=${SERVICE}" \
-d "groupName=${GROUP}" \
-d "namespaceId=${NAMESPACE_ID}" \
-d "ip=10.0.1.10" -d "port=8080" \
-d "clusterName=bj" \
-d "weight=1" -d "healthy=true"
# 注册实例到 sh 集群
curl -s -X POST "${NACOS_ADDR}/nacos/v1/ns/instance" \
-d "serviceName=${SERVICE}" \
-d "groupName=${GROUP}" \
-d "namespaceId=${NAMESPACE_ID}" \
-d "ip=10.0.2.10" -d "port=8080" \
-d "clusterName=sh" \
-d "weight=1" -d "healthy=true"
2)指定集群发现实例(就近访问)
curl -s "${NACOS_ADDR}/nacos/v1/ns/instance/list?serviceName=${SERVICE}&groupName=${GROUP}&namespaceId=${NAMESPACE_ID}&clusters=bj"
预期效果:返回 bj 集群实例列表,若 bj 无健康实例将回退到其他集群。
3)在不同 Group 中注册灰度实例
curl -s -X POST "${NACOS_ADDR}/nacos/v1/ns/instance" \
-d "serviceName=${SERVICE}" \
-d "groupName=gray_group" \
-d "namespaceId=${NAMESPACE_ID}" \
-d "ip=10.0.1.11" -d "port=8080" \
-d "clusterName=bj" \
-d "weight=1" -d "healthy=true"
预期效果:DEFAULT_GROUP 与 gray_group 相互隔离,需要在客户端/调用侧显式指定 group。
配置示例:Spring Cloud 客户端指定命名空间/分组/集群
application.yaml:
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: dev-namespace-id
group: DEFAULT_GROUP
cluster-name: bj
说明:
- namespace 决定该服务在哪个命名空间注册与可见。
- group 决定同命名空间内的逻辑隔离。
- cluster-name 影响就近访问与实例返回顺序。
排错清单(含命令)
- 看不到服务实例
- 检查 namespaceId 是否一致:
bash
curl -s "${NACOS_ADDR}/nacos/v1/ns/instance/list?serviceName=${SERVICE}&groupName=${GROUP}&namespaceId=${NAMESPACE_ID}"
- 控制台比对服务所在命名空间与客户端配置一致性。
- 发现不到指定集群实例
- 查询实例注册时的 clusterName:
bash
curl -s "${NACOS_ADDR}/nacos/v1/ns/instance/list?serviceName=${SERVICE}&groupName=${GROUP}&namespaceId=${NAMESPACE_ID}"
- 确认服务注册时与调用方 cluster-name 一致。
- 实例健康状态异常
- 查看实例健康字段:
bash
curl -s "${NACOS_ADDR}/nacos/v1/ns/instance/list?serviceName=${SERVICE}&groupName=${GROUP}&namespaceId=${NAMESPACE_ID}" | jq '.hosts[].healthy'
- 若健康检查为 false,检查服务心跳/端口可达性。
实践建议
- 多环境优先使用 Namespace,避免跨环境误调用。
- 同环境多业务线使用 Group,保持服务命名清晰。
- 跨机房部署使用 Cluster,结合就近访问与容灾。
- 服务标识规范:namespace + group + service,减少调用歧义。
练习
1. 创建 dev/test/prod 三个命名空间,在 dev 与 test 分别注册同名服务,验证互不可见。
2. 在 DEFAULT_GROUP 与 gray_group 各注册 1 个实例,调用发现接口验证按 group 隔离。
3. 在 bj 与 sh 集群各注册 1 个实例,指定 clusters=bj 发现,观察回退机制。