4. 接入层服务边界:API Gateway、认证鉴权服务、请求路由服务的职责划分与数据流

对象存储系统的接入层是外部请求进入系统内部的第一道防线,也是服务边界的起点。在领域驱动设计(DDD)视角下,接入层并非业务逻辑的承载者,而是协议转换、安全校验、流量治理与请求分发的枢纽。本章聚焦三个核心服务——API Gateway、认证鉴权服务、请求路由服务——的职责边界与协作数据流。

4.1 三层服务的职责矩阵

下表从职责、关注点、输出产物三个维度,明确三个服务的边界划分:

服务名称 核心职责 关注点 输出产物
API Gateway 协议适配、流量入口、限流熔断、请求预处理 HTTP/HTTPS 协议、TLS 终止、速率限制、请求日志 标准化内部请求上下文(含请求 ID、客户端 IP、用户代理)
认证鉴权服务 身份验证、权限校验、Token 签发与验证 用户凭证、签名算法(如 HMAC-SHA256)、策略评估 认证 Token 或权限断言(含用户 ID、角色、资源范围)
请求路由服务 请求分发、桶定位、分区映射、负载均衡 桶名解析、元数据索引、后端节点状态、一致性哈希 目标后端服务地址与请求转发指令
边界原则:API Gateway 不解析业务语义(如桶名、对象键),认证鉴权服务不决定请求发往哪个后端,请求路由服务不校验用户身份。三者各司其职,通过明确的上下文边界降低耦合。

4.2 请求处理流程与数据流

一个典型的对象存储写请求(如 PUT Object)经过接入层的完整数据流如下:

  1. 客户端发起请求 → 到达 API Gateway 的监听端口(通常为 443)。
  2. API Gateway 预处理:完成 TLS 卸载、提取请求头、生成全局请求 ID、执行速率限制检查。若超限,直接返回 429 Too Many Requests。
  3. 转发至认证鉴权服务:API Gateway 将请求上下文(方法、路径、签名头、时间戳)发送给认证鉴权服务。该服务验证签名有效性、检查用户状态、评估资源级权限(如“用户 A 是否有权限写入桶 B”)。
  4. 返回权限断言:认证鉴权服务返回 AuthResult 对象,包含 userId、role、allowedActions、tokenExpiry。若鉴权失败,API Gateway 直接返回 403 Forbidden。
  5. 请求路由服务介入:API Gateway 将请求(含桶名 bucketName)发送至请求路由服务。路由服务通过一致性哈希或元数据索引,定位该桶所在的后端存储集群及分区。
  6. 返回目标端点:请求路由服务返回 RouteResult,包含目标服务地址(如 storage-cluster-3:9000)和分区 ID。
  7. API Gateway 转发请求:将原始请求体、权限断言、路由信息打包为内部 RPC 请求,发送至目标存储节点。
数据流关键点:认证鉴权服务与请求路由服务之间无直接调用关系。API Gateway 作为编排者,先调用认证鉴权,再调用路由服务,确保未授权请求不会触发路由查询,减少无效负载。

4.3 接入层服务协作架构图

下图展示了三个服务在接入层的协作关系与数据流向:

接入层服务协作架构图 客户端 API Gateway 认证鉴权服务 请求路由服务 后端存储节点 HTTP PUT 鉴权请求 AuthResult 路由查询(桶名) RouteResult 转发请求+断言 关键设计 • 认证鉴权与路由解耦 • 未授权请求不触发路由

4.4 服务边界的关键设计决策

  • 认证鉴权无状态化:认证鉴权服务不维护会话状态,每次请求独立验证签名与权限。这使其易于水平扩展,并支持无状态网关部署。
  • 路由服务与元数据解耦:请求路由服务不直接访问全量元数据,而是通过缓存的一致性哈希环或分区映射表定位桶。元数据变更(如桶迁移)通过事件驱动更新路由缓存,避免路由服务成为瓶颈。
  • API Gateway 的轻量化:Gateway 不承担任何业务逻辑,仅做协议转换与编排。业务语义(如对象键解析、分片策略)由后端服务处理,防止 Gateway 膨胀为“上帝服务”。
常见反模式:将认证鉴权逻辑嵌入 API Gateway 内部,或让请求路由服务直接访问用户数据库。前者导致 Gateway 难以独立升级安全策略,后者使路由服务耦合用户上下文,违背单一职责原则。

4.5 数据流中的关键契约

三个服务之间的数据交换依赖明确的接口契约,以下为典型契约结构:

// 认证鉴权请求契约
{
  "httpMethod": "PUT",
  "path": "/bucket-01/object-key.txt",
  "headers": {
    "Authorization": "AWS4-HMAC-SHA256 ...",
    "x-amz-date": "20250301T120000Z"
  },
  "clientIp": "203.0.113.5"
}

// 认证鉴权响应契约 (AuthResult)
{
  "authenticated": true,
  "userId": "user-abc-123",
  "role": "bucket-writer",
  "allowedActions": ["s3:PutObject"],
  "tokenExpiry": 1719792000
}

// 路由查询请求契约
{
  "bucketName": "bucket-01",
  "requestId": "req-9876-xyz"
}

// 路由查询响应契约 (RouteResult)
{
  "targetEndpoint": "storage-cluster-3:9000",
  "partitionId": "p-07",
  "shardKey": "bucket-01#p-07"
}
契约版本化:建议为每个服务接口定义显式版本号(如 v1/auth、v1/route),并在 API Gateway 中维护版本映射表。当后端服务升级时,Gateway 可灰度切换版本,避免全量升级风险。

4.6 接入层服务的部署边界

从物理部署视角,三个服务应遵循以下边界:

服务 推荐部署模式 隔离级别 说明
API Gateway 独立进程/容器,多副本部署于网络边缘 进程级隔离 与业务服务分离,避免 TLS 卸载影响后端性能
认证鉴权服务 无状态集群,独立部署 进程级隔离 可独立扩缩容应对认证峰值
请求路由服务 嵌入元数据缓存层,独立部署 进程级隔离 路由表变更不影响其他服务

通过明确的职责划分与数据流设计,接入层三个服务形成了清晰的领域边界:API Gateway 负责通信基础设施,认证鉴权服务负责安全领域,请求路由服务负责位置领域。三者协作,为对象存储系统提供了可扩展、可观测、高可用的接入能力。