bigywater.tech
微服务 · 50

注册信息与分组隔离:元数据、权重、版本,namespace、cluster、group

注册信息里除了地址还该放什么?namespace、group、cluster 怎么隔离环境和团队?权重和元数据谁来用?Consul 没有 namespace 又怎么做?这篇用 Nacos 3.2.4 和 Consul 2.0.4 逐项查出来。

3 → 2 → 1
Nacos 里 public · DEFAULT_GROUP · web 的 3 个实例,加 clusterName=bj 剩 2 个,clusterName=sh 剩 1 个
66.5%
权重 4 的实例在权重 1 : 1 : 4 的加权随机选择 10000 次里被选中的比例(应得 66.7%)
0 个(空)
配错 group(test · TEAM_B · web)时查询得到的实例数:空列表,而不是报错

三元组隔离

实测 · 本机执行输出
  查询                                            | 实例数 | 看到的实例(地址(集群,版本,权重))                                           |           
  ----------------------------------------------+-----+---------------------------------------------------------------+-----------
  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 的流量;权重和元数据都是实例注册时带来的字符串/数字,服务端只负责存储和返回,过滤和加权选择要靠客户端(或网关)实现

服务端存储并返回,选择和过滤靠客户端或网关。

Consul 对照

实测 · 本机执行输出
  查询                                                  | 实例数 | 看到的实例(地址(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 前缀。

分步演示

注册信息与分组隔离
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.8 / Go / nginx / Envoy / etcd / Consul / Nacos / OpenTelemetry / Prometheus(按各篇注明用到哪些及版本);所有服务都是本机自己起的进程,端口 9150 以上,只监听 127.0.0.1,不连任何外部服务,不碰本机已有的实例;故障用 kill -9 进程、让连接断开或在代码里注入延迟与错误来制造;计时用 time.perf_counter,数字每次运行会有小幅抖动。Nacos 3.2.4 官方发行包(单机模式、Java 17、鉴权关闭),nacos-sdk-python 3.2.0 通过 gRPC 注册,查询用 HTTP /nacos/v3/client/ns/instance/list;Consul 2.0.4 开发模式 agent。两处我最初用错、实测后改正:(1) Nacos 的临时实例绑定在连接上,同一个 SDK 客户端对同一个服务重复注册只会替换自己上一次的实例,所以每个实例用了单独的 SDK 客户端;(2) v3 的查询参数是 clusterName,我照 v2 的习惯写成 clusters 时被服务端静默忽略;权重选择的 10000 次是客户端按权重加权随机,由我的代码完成
    • 没有验证:Nacos 持久实例(ephemeral = false)与临时实例的差别(见第 54 篇);Nacos 集群模式;Nacos 的 selector / 路由插件;Consul 企业版的 namespace 和 admin partition;nacos-sdk-python 的订阅与本地缓存(这里只用 HTTP 查询)
    京ICP备2026067502号-1京公网安备11010502063487号