流量标签在服务治理中如何传递?
简化版
流量标签应由可信入口根据认证身份和规则生成,通过统一上下文在 HTTP/RPC、异步线程和消息中显式传播,并在每个边界做白名单、大小和权限校验。 标签要有作用域、版本和丢失策略;不能信任客户端任意 header,也不能依赖 ThreadLocal 自动穿过线程池与 MQ。
详细版
标签分追踪类、路由类、治理类和业务类,只传播数量受控且下游确实需要的字段,如 traceId、tenantTier、lane、regionHint。其中 traceId 虽可作为上下文跨调用传播,但属于高基数关联标识;观测时应进入日志、Trace 或 exemplar,不能作为普通指标标签。网关清除外部同名 header,认证后重新生成并可签名;RPC 拦截器负责注入/提取,线程池使用显式 context wrapper,消息把允许字段写入版本化属性。
每一跳记录标签存在率、丢失率、非法值和截断次数。若路由标签丢失,有状态灰度写应快速失败,无状态查询可回落稳定版本;策略必须预先定义。禁止传播 token、手机号等秘密,也不能把 userId 直接作为指标标签。
完整版教学
一、标签为什么是治理输入
灰度路由要知道 lane,租户限流要知道 tenant,地域亲和要知道 region,链路追踪要知道 trace。标签一旦丢失,请求可能串入稳定版;标签被伪造,则普通用户可能绕过配额或进入内部环境。因此传播既是可用性问题,也是安全边界。
心法:标签不是随请求搭便车的字符串,而是会改变路由和权限的受控上下文。
二、先建立标签目录
| 标签 | 来源 | 下游用途 | 是否允许外部提供 |
|---|---|---|---|
| traceId | 网关/追踪 SDK | 链路关联 | 可接收但需格式校验 |
| lane | 灰度平台 | 版本路由 | 否 |
| tenantTier | 认证系统 | 配额与优先级 | 否 |
| locale | 客户端 | 展示语言 | 是,白名单校验 |
目录还记录类型、最大长度、TTL、敏感等级和 owner。没有登记的字段默认不跨服务传播,避免 header 越积越大。
三、同步调用的注入与提取
入口先删除 X-Internal-Lane 等内部字段,完成认证后创建不可变 context。HTTP/RPC 客户端拦截器从 context 选取允许字段写入 header,服务端拦截器校验签名、版本和长度后恢复。业务代码不应在各处手写 header,否则容易漏传或拼错。
external request
-> gateway[清洗 + 认证 + lane=v2]
-> RPC metadata[lane=v2, ctx-version=3]
-> service B[校验后恢复 context]
四、线程切换不会自动继承语义
ThreadLocal 在线程池复用时既可能丢失,也可能残留上一个请求的标签。提交任务时捕获必要 context,执行前安装,finally 中恢复或清除。协程和 Reactor 等模型使用框架提供的 Context,不要假设线程与请求一一对应。
若 1000 个异步任务中有 20 个丢失 lane,2% 串线已足以污染灰度数据。应通过自动化测试和传播完整率指标发现,而不是等用户反馈。
五、消息传播要考虑寿命和版本
消息可能数小时后消费,不能把短期权限 token 原样放入。只写业务处理需要的稳定声明,并带 contextVersion;消费者对白名单字段解析,未知字段忽略,缺少关键标签按明确策略处理。重试与死信转发必须保留允许标签,但更新 attempt 等消息级元数据。
{"contextVersion":3,"lane":"v2","tenantTier":"gold","traceId":"..."}
六、安全、容量与可观测性
限制单个字段和总 header 大小,例如标签总量不超过 4KB,避免代理返回 431 或被大 header 放大网络成本。敏感身份使用内部 ID 或不可逆分组,不传播手机号、Cookie 和访问令牌。跨信任域时对关键标签签名,接收方还要检查调用方身份。
指标统计每个 hop 的标签存在率、非法率、版本分布和 fallback 次数。维度只能使用 lane、version 这类低基数值;具体 traceId 进入日志或 trace exemplar。
七、常见误区与追问
- 误区:把客户端 header 原样透传最省事。 外部可伪造内部路由和配额标签。
- 误区:ThreadLocal 会自动跨线程池。 线程复用还可能造成标签串请求。
- 误区:所有上下文都应该进入消息。 短期凭证会过期,敏感数据还会扩大泄漏面。
- 误区:标签越多,治理越灵活。 header 大小、高基数与耦合成本会快速增长。
- 追问:关键 lane 丢失怎么办? 有状态写通常失败,无状态读可回落;策略按接口预先声明。
- 追问:如何防篡改? 可信入口重建,跨域时签名,并结合调用方身份校验。
- 追问:怎样发现中间某跳丢标? 每跳记录传播完整率,并用 trace 对比入口和当前 context。
八、加强记忆
流量标签传播围绕“可信生成、白名单携带、跨模型显式传递、每跳校验、丢失有策略”展开。同步 RPC、线程池和 MQ 是三个最容易断链的边界;再补上大小、敏感性、版本与低基数观测,才能让灰度和配额既稳定又安全。