集群路由

并行开发场景下,多个项目共享同一套服务,每个项目对应一组灰度实例(cluster)。流量通过 X-Zeus-Cluster Header 端到端路由:“有标识走标识,无标识走 default”

术语统一为 cluster,与 K8s/Istio/Envoy/gRPC xDS 对齐。

传播链路

[Client] X-Zeus-Cluster: canary
   │
   ▼ HTTP Header / gRPC metadata["x-zeus-cluster"]
[Gateway (proxy)] NewDiscoverySelector 从 Header 读 cluster → 选 cluster → 转发
   │
   ▼ Header 透传
[HTTP Server (srv-1)] 入口 clusterInjector 自动注入 ctx
   │   ├─ tracing: span.Attrs["zeus.cluster"]=cluster
   │   ├─ metrics: labels["cluster"]=cluster
   │   └─ log: 自动 Field{cluster}
   ▼
[业务 handler] ctx 已含 cluster
   │
   ▼ client.Do(): resolveCluster 读 ctx → 选 cluster → 注入 Header
[HTTP Server (srv-2)] 同 srv-1

核心 API

 1import "github.com/go-zeus/zeus/routing"
 2
 3// HTTP 入口注入
 4ctx := routing.WithCluster(r.Context(), routing.ClusterFromHTTPHeader(r.Header))
 5
 6// 业务读取
 7c := routing.FromContext(ctx)
 8
 9// 常量
10routing.HeaderCluster   // "X-Zeus-Cluster"
11routing.MetadataCluster // "x-zeus-cluster"(gRPC metadata)
12routing.Default         // "default"

默认行为

组件行为
server/http默认自动注入 cluster(WithoutAutoClustering() 关闭)
plugins/server/grpc默认 UnaryServerInterceptor 从 metadata 提取 cluster 注入 ctx
plugins/client/grpcUnaryInterceptor() 从 ctx cluster 注入 outgoing metadata
log自动 prepend Field{cluster}(仅非 default 时)
plugins/middleware/tracing自动写入 span attribute zeus.cluster
plugins/middleware/metrics自动打 label cluster

治理模块按 cluster 维度

 1import clusterlimit "github.com/go-zeus/zeus/ratelimit/cluster"
 2import clusterbreak "github.com/go-zeus/zeus/circuitbreaker/cluster"
 3import clusterretry "github.com/go-zeus/zeus/retry/cluster"
 4
 5// 每个 cluster key 独立桶/熔断器/重试策略
 6limiter := clusterlimit.New(func() ratelimit.Limiter { return token.New(100, 10) })
 7ok := limiter.Allow(ctx) // 从 ctx 提取 cluster 作为 key
 8
 9cb := clusterbreak.New(func() circuitbreaker.Breaker { return counter.New(100, 0.5) })
10err := cb.Execute(ctx, func() error { ... })
11
12cr := clusterretry.New(func() retry.Retrier { return exponential.New(3, 100*time.Millisecond) })
13r := cr.NewRetriever(ctx)

完整示例

参见 examples/12-cluster-routing/:单进程演示 gateway → srv1 → srv2 多 cluster 路由 + cluster 全链路传播。

1curl http://localhost:8081/ping                                # default 链路
2curl -H "X-Zeus-Cluster: canary" http://localhost:8081/ping    # canary 链路