注册信息里除了地址还该放什么?namespace、group、cluster 怎么隔离环境和团队?权重和元数据谁来用?Consul 没有 namespace 又怎么做?这篇用 Nacos 3.2.4 和 Consul 2.0.4 逐项查出来。
查询 | 实例数 | 看到的实例(地址(集群,版本,权重)) | ----------------------------------------------+-----+---------------------------------------------------------------+----------- public · DEFAULT_GROUP · web | 3 | 10.0.0.2(bj,v2,w=4), 10.0.1.1(sh,v1,w=1), 10.0.0.1(bj,v1,w=1) | public · DEFAULT_GROUP · web · clusterName=bj | 2 | 10.0.0.2(bj,v2,w=4), 10.0.0.1(bj,v1,w=1) | public · DEFAULT_GROUP · web · clusterName=sh | 1 | 10.0.1.1(sh,v1,w=1) | public · TEAM_B · web | 1 | 10.0.2.1(bj,v1,w=1) | test · DEFAULT_GROUP · web | 2 | 10.9.0.1(bj,v1,w=1), 10.9.0.2(bj,v2,w=1) | test · TEAM_B · web | 0 | (空) | public · DEFAULT_GROUP · cart | 1 | 10.0.0.3(bj,v1,w=1) | public · 不带 groupName 参数 | 3 | 10.0.0.2(bj,v2,w=4), 10.0.1.1(sh,v1,w=1), 10.0.0.1(bj,v1,w=1) | (HTTP 200) 同一个服务名 web 在不同的 namespace、不同的 group 下是完全不同的服务,互相看不到;cluster 是同一个服务内部的细分(这里按机房),查询时用 clusterName 参数过滤(v3 的 client API;我最初照 v2 的习惯写成 clusters,被服务端静默忽略,三个实例都返回了)。隔离的单位是 (namespace, group, 服务名) 这三元组,客户端配置错了 namespace 或 group,查到的是空列表而不是报错
namespace、group、服务名一起决定一个服务;跨空间、跨分组互相看不到。
实例 | 被选中次数(10000 次) | 占比 | 按权重应得的占比 --------------------+----------------+-------+--------- 10.0.0.1(bj,v1,w=1) | 1655 | 16.6% | 16.7% 10.0.0.2(bj,v2,w=4) | 6647 | 66.5% | 66.7% 10.0.1.1(sh,v1,w=1) | 1698 | 17.0% | 16.7% 按 metadata.version = v2 过滤后剩下 1 个:10.0.0.2(bj,v2,w=4)。权重 4 的实例得到约 4/6 的流量;权重和元数据都是实例注册时带来的字符串/数字,服务端只负责存储和返回,过滤和加权选择要靠客户端(或网关)实现
服务端存储并返回,选择和过滤靠客户端或网关。
查询 | 实例数 | 看到的实例(地址(Passing 权重)) ----------------------------------------------------+-----+-------------------------------------------- 全部 | 3 | 10.0.0.1(w=1), 10.0.0.2(w=5), 10.9.0.1(w=1) tag=prod | 2 | 10.0.0.1(w=1), 10.0.0.2(w=5) filter: Meta.env == "prod" and Meta.version == "v2" | 1 | 10.0.0.2(w=5) filter: ServiceTags contains "test" | 1 | 10.9.0.1(w=1) Consul 的 DNS 查询:web.service.consul 的 SRV 应答里有 3 条记录;带 tag 的 prod.web.service.consul(<tag>.<service>.service.consul)有 2 条。Consul 开源版没有 namespace,环境隔离靠 Tags / Meta 约定加上查询时过滤;Weights 的 Passing / Warning 分别是实例健康检查通过 / 警告时 DNS 应答里使用的权重
开源版没有 namespace,用 Tags / Meta 约定加 filter 表达式或 DNS tag 前缀。