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 个核心职责:

  1. 流量隔离与路由 — 网关根据签名中的 tenant_id 将请求分发到对应租户的专用服务实例或命名空间。
  2. 权限校验 — 每个服务在接收请求时,验证签名有效性,防止跨租户越权访问。
  3. 可观测性标签 — 签名作为自定义标签注入 Trace 和 Metrics,实现租户级别的监控与排障。
  4. 限流与配额管理 — 基于签名识别租户,执行差异化的限流策略和资源配额。
链路示例: 用户请求 → 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 到微服务链路的完整绑定与传递流程:

租户签名与 ConfigMap 绑定关系及链路传递 ConfigMap tenant-signature-config 密钥 / 算法 / 作用域 Sidecar 代理 读取签名配置 生成租户签名 API 网关 校验签名 提取 tenant_id 订单服务 传递签名 scope 校验 库存服务 验证签名 租户分表查询 数据库 按 tenant_id 分表 ConfigMap 热更新 Sidecar 自动重载 无需重启 Pod

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 中。这样在密钥轮换或租户下线时,可以最小化影响范围,避免误操作影响其他租户。