3. 租户签名概念
3.1 什么是租户签名
在微服务与云原生架构中,租户签名(Tenant Signature) 是一个由平台自动生成或由租户配置的、唯一标识一个租户身份的数字凭证。它通常以 键值对 或 JWT 声明 的形式嵌入到请求的 Header、Cookie 或 gRPC Metadata 中,用于在服务间传递时标记流量归属。
租户签名的核心组成包括:
| 字段 | 说明 | 示例值 |
|---|---|---|
tenant_id |
租户唯一标识 | tenant-abc-001 |
signature |
基于密钥生成的 HMAC 签名 | a1b2c3d4e5f6... |
expires_at |
签名有效期时间戳 | 1718000000 |
scope |
签名作用域(服务/命名空间) | payment-service |
关键理解: 租户签名不是简单的用户 ,它是跨微服务链路中持续传递的“租户身份证”,确保每个请求都能被正确路由、限流和审计。
3.2 签名在微服务链路中的用途
在微服务调用链中,租户签名承担以下 4 个核心职责:
- 流量隔离与路由 — 网关根据签名中的
tenant_id将请求分发到对应租户的专用服务实例或命名空间。 - 权限校验 — 每个服务在接收请求时,验证签名有效性,防止跨租户越权访问。
- 可观测性标签 — 签名作为自定义标签注入 Trace 和 Metrics,实现租户级别的监控与排障。
- 限流与配额管理 — 基于签名识别租户,执行差异化的限流策略和资源配额。
链路示例: 用户请求 → API 网关(校验签名)→ 订单服务(提取 tenant_id)→ 库存服务(验证 scope)→ 数据库(按租户分表查询)。签名在整个链条中逐级传递,任何一环验证失败都会直接拒绝请求。
3.3 签名与 ConfigMap 的绑定关系
在 Kubernetes 环境中,租户签名并非硬编码在代码中,而是通过 ConfigMap 进行声明式管理。这种绑定关系使得签名配置可以动态变更,无需重新构建镜像或重启 Pod。
绑定关系分为三个层次:
| 层次 | ConfigMap 内容 | 绑定方式 |
|---|---|---|
| 签名密钥 | 租户的 HMAC 密钥、签名算法 | 通过 envFrom 注入到 Pod 环境变量 |
| 签名规则 | 签名生成逻辑、有效期、作用域 | 挂载为文件,由 Sidecar 代理读取 |
| 租户映射表 | tenant_id 与命名空间/服务的映射关系 | 通过 ConfigMap 热更新,网关动态加载 |
以下是一个典型的 ConfigMap 定义示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: tenant-signature-config
namespace: production
data:
tenant-abc.yaml: |
tenant_id: "tenant-abc-001"
secret_key: "hmac-secret-xxxx"
algorithm: "HS256"
expires_in_seconds: 3600
scope: "payment-service,order-service"
tenant-xyz.yaml: |
tenant_id: "tenant-xyz-002"
secret_key: "hmac-secret-yyyy"
algorithm: "HS256"
expires_in_seconds: 7200
scope: "inventory-service"
安全注意: 签名密钥属于敏感信息,生产环境中应使用 Secret 而非 ConfigMap 存储密钥。ConfigMap 仅用于存储非敏感配置(如算法、作用域、映射关系)。密钥与配置分离是云原生安全的最佳实践。
3.4 签名与 ConfigMap 绑定关系示意图
下图展示了租户签名从 ConfigMap 到微服务链路的完整绑定与传递流程:
3.5 签名变更与 ConfigMap 热更新
当租户签名配置发生变更时(如密钥轮换、作用域调整),运维人员只需更新 ConfigMap 中的对应条目。Kubernetes 会将变更自动同步到挂载卷或环境变量,Sidecar 代理检测到文件变化后,无需重启 Pod 即可加载新签名规则。
变更流程如下:
- 步骤 1: 运维更新 ConfigMap
tenant-signature-config中的tenant-abc.yaml密钥。 - 步骤 2: Kubernetes 将新配置同步到所有挂载该 ConfigMap 的 Pod 卷中。
- 步骤 3: Sidecar 代理通过 inotify 或 fsnotify 监听文件变化,自动重载签名配置。
- 步骤 4: 新生成的请求使用更新后的签名,旧签名在有效期过后自动失效。
最佳实践: 建议为每个租户单独创建一个 ConfigMap 条目(如上例中的
tenant-abc.yaml),而不是将所有租户配置写在一个大 YAML 中。这样在密钥轮换或租户下线时,可以最小化影响范围,避免误操作影响其他租户。