说明已授权请求如何经过流量保护、写入安全门禁和后端调用,并保持稳定的对外语义。
6. 请求处理流程
6.1 请求治理与执行层
请求治理与执行层只接收第 5.6 节输出的已授权请求。廉价且能够保护系统容量的检查在前,支付写请求的密码学校验在后;路由策略中心的第二执行点只有在身份、路由和请求类型都可信后才选择后端。
%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 32, "rankSpacing": 38, "htmlLabels": true}}}%%
flowchart TB
INPUT["已授权请求<br/>可信身份 + Scope · route · request_class"] --> RATE["分层限流<br/>来源 IP · Key · 商户 · 平台"]
RATE --> IDEMPOTENCY{"写请求或路由要求幂等?"}
IDEMPOTENCY -->|"是"| IDEM_CHECK["校验 Idempotency-Key 语法<br/>只透传 · 去重由后端拥有"]
IDEMPOTENCY -->|"否"| WRITE_SECURITY
IDEM_CHECK --> WRITE_SECURITY{"生产支付写路由?"}
WRITE_SECURITY -->|"是"| PROOF["持有证明<br/>Ed25519 签名 + Nonce<br/>或认证后校验 mTLS 证书绑定"]
WRITE_SECURITY -->|"否"| ROUTE
PROOF --> ROUTE["执行点 2 · 后端选择<br/>健康候选 · 读取一致性门禁<br/>writer 与跨地域写入门禁"]
ROUTING["流量路由策略中心<br/>后端候选与故障转移策略"] -.-> ROUTE
ROUTE --> HEADERS["清除外部伪造的内部身份头<br/>注入网关签名身份上下文"]
HEADERS --> CALL["调用策略<br/>超时上限 · 熔断 · 有界重试<br/>非幂等写请求不自动重试"]
CALL --> PLATFORM["一个明确的支付平台后端"]
PLATFORM --> RESPONSE["响应规范化<br/>稳定错误码 + request_id"]
classDef input fill:#F4F7FB,stroke:#72849A,color:#253954,stroke-width:1.5px
classDef runtime fill:#FFFFFF,stroke:#4F79A7,color:#18212F,stroke-width:1.5px
classDef policy fill:#EDF8F3,stroke:#16835E,color:#124D3B,stroke-width:1.5px
classDef external fill:#F7F9FC,stroke:#8A9AAF,color:#18212F,stroke-width:1.5px
class INPUT,ROUTING input
class RATE,IDEMPOTENCY,IDEM_CHECK,WRITE_SECURITY,PROOF,HEADERS,CALL,RESPONSE runtime
class ROUTE policy
class PLATFORM external
mTLS 握手发生在第 4.1 节所述的实际 TLS 终止点;这里只校验证书上下文是否与已认证 API Key 显式绑定。Ed25519 的 Nonce 状态不可用且后端全局幂等能力未验证时,支付写请求失败关闭。路由执行点只输出一个目标,网关不向多个业务数据库双写。
跨抽象节点的请求时序
sequenceDiagram
participant M as 商户系统
participant I as 统一接入层
participant A as 访问控制中心
participant C as 本地域配置快照缓存
participant G as 请求治理与执行层
participant S as 支付平台服务
M->>I: TLS 请求与 API Key
I->>I: 入口选择、DDoS、TLS、WAF、协议与可信来源
I->>A: 规范请求、可信来源 IP 与 mTLS 上下文
A->>A: 生成 request_id 并暂存路由匹配结果
A->>C: 读取版本化授权快照
C-->>A: Key 摘要、状态、绑定、Scope、版本
A->>A: 身份、Key-IP、路由可见性与 Scope 判定
alt 身份与路由授权通过
A->>G: 已授权请求与可信身份上下文
G->>G: 限流、幂等、支付写安全与后端选择
G->>S: 转发请求和受信身份上下文
S-->>G: 平台响应
G-->>I: 规范化响应
I-->>M: 返回稳定响应
else 身份或 IP 认证拒绝
A-->>I: 统一 401,不暴露具体安全配置
I-->>M: 返回 401 与 request_id
else 路由不存在或 Scope 不足
A-->>I: 统一 404,不暴露路由可见性
I-->>M: 返回 404 与 request_id
end
该时序图只表达抽象边界与关键依赖之间的先后关系及 401/404 分支,不重复各节点的内部检查。本地域配置快照缓存是访问控制中心的内部依赖,不是新增抽象边界。流量路由策略中心不作为同步参与者:执行点 1 已包含在统一接入层,执行点 2 已包含在请求治理与执行层。
每个请求按以下固定顺序处理:
- 边缘层完成 TLS、WAF 和基础协议校验,得到可信来源 IP。
- 网关分配全局唯一
request_id,规范化路径、方法和请求头。 - 网关可以暂存内部路由匹配结果,但在认证完成前不得根据该结果返回不同响应。
- API Key 验证服务解析公开 Key ID,取得配置快照并验证 Secret 摘要。
- 验证 Key 的商户归属、入口环境、状态、生效时间和过期时间。
- 验证来源 IP 是否与该 Key 存在显式绑定;以上任一认证步骤失败都统一返回
401。 - 认证成功后处理路由匹配结果;路由不存在或 Key 缺少 required scope 时统一返回
404,避免路由枚举。 - 对可见路由执行附加策略;明确允许披露的业务策略拒绝可以返回
403。 - 执行 Key 级和商户级限流。只有
request_class为写入,或路由策略明确要求幂等时,网关才强制Idempotency-Key必填并校验长度和字符格式;网关只透传该值,不保存去重状态,内容冲突由后端平台检测并返回409。 - 对支付写请求执行第 5.5 节规定的 mTLS 或 Ed25519 请求签名校验。
- 根据商户路由分区、服务能力声明和后端健康状态选择一个目标实例。
- 清除外部伪造的内部身份头,写入由网关签名的商户、Key、Scope、区域和请求标识。
- 执行带上限的连接、请求和响应超时,不对非幂等写请求自动重试。
- 写入结构化访问日志、授权决策日志、指标和分布式追踪。
6.2 对外错误语义
| HTTP 状态 | 使用场景 | 对外信息 |
|---|---|---|
400 | 协议、字段或幂等键不合法 | 返回稳定错误码和 request_id |
401 | Key 缺失、格式错误、未知、Secret 不匹配、状态无效、环境不符或 IP 未绑定 | 统一返回认证失败,不区分具体原因 |
403 | 身份和路由均可见,但明确可披露的附加业务策略拒绝 | 返回稳定访问拒绝码,不披露安全配置 |
404 | 路由不存在,或已认证 Key 缺少该路由的 required scope | 两种情况使用相同响应,避免路由枚举 |
409 | 后端平台判定幂等键与已有请求内容冲突 | 网关原样传递稳定冲突错误码,不在网关保存去重状态 |
429 | 商户或 Key 超过限流策略 | 返回可安全披露的重试时间 |
502 | 后端协议错误 | 返回 request_id |
503 | 授权组件或目标服务不可用 | 返回 request_id 和可重试标记 |
504 | 后端超时 | 返回 request_id 和可重试标记 |
内部日志保留精确 reason_code,但对外响应不披露 Key 是否存在、绑定了哪些 IP 或拥有哪些权限。