API 网关专栏 · 第 28

API 网关如何处理 GraphQL API 请求

2025年04月25日
API 网关如何处理 GraphQL API 请求

简介

在不断发展的 API 领域中,GraphQL 作为传统 RESTful API 的现代替代方案,正迅速受到青睐。GraphQL 由 Facebook 开发并于 2015 年开源,它解决了 REST 的一些局限性,提供了一种查询语言,允许客户端准确请求所需的数据。通过将多个数据获取操作合并为单一 HTTP 请求,GraphQL 显著优化了 Web 和移动应用程序中的 API 交互。

然而,这种灵活性也带来了新的运维、安全和架构挑战——尤其是对于依赖 API 网关作为其服务中央入口点的组织而言。与通常暴露多个特定资源端点的 REST API 不同,GraphQL API 通过单一 HTTP 端点运行,通常通过 POST 方法在请求体中携带复杂的查询结构。这种架构上的转变要求 API 网关超越简单的 URL 路由和无状态的请求转发。

本文将详细探讨现代 API 网关(如 Apache APISIX、Kong、NGINX 和 Envoy)如何处理 GraphQL 请求。它涵盖了在 GraphQL 独特特性的背景下,网关的基本功能,如请求路由、查询验证、身份验证和授权、缓存、限流、日志记录和监控。

阅读完本文后,你将全面了解:

  • 为什么 API 网关对于基于 GraphQL 的架构仍然不可或缺
  • 在网关层处理 GraphQL 请求的技术复杂性
  • 用于安全、可观测和高效管理 GraphQL API 的实用模式和配置
  • 真实世界的实现示例和代码片段
  • 源自生产部署的最佳实践

无论你是在全新的应用程序中采用 GraphQL,还是将其集成到现有的微服务架构中,在 API 网关层面掌握 GraphQL 请求的处理对于安全性、可扩展性和运维可靠性都至关重要。

GraphQL API 特性与 REST 的对比

在技术和运维层面上理解 GraphQL 与 REST 的区别,是认识为什么 API 网关需要针对 GraphQL 流量采取专门处理策略的关键。

REST API 模型

REST(表述性状态转移)API 遵循基于资源的模型。每种类型的资源(用户、产品、订单)都有其独特的 URI 端点。CRUD(创建、读取、更新、删除)操作映射到 HTTP 方法(GET、POST、PUT、DELETE)。REST API:

  • 是无状态的
  • 返回服务器定义的固定数据结构
  • 使用多个 URI 来处理不同的资源和操作
  • 相对容易根据 URI 和方法进行缓存

REST 交互示例:

  • GET /api/users/123
  • POST /api/orders

GraphQL API 模型

GraphQL 将所有 API 交互集中在一个单一的 HTTP 端点下(通常是 /graphql),客户端向该端点发送查询,准确描述所需的数据及其嵌套方式。

主要特性:

  • 单一端点:/graphql
  • 客户端定义的查询:客户端构建查询(Query)和变更(Mutation)来指定数据字段
  • 最小化过度获取/获取不足(Over-fetching/Under-fetching):没有多余或不充分的数据
  • 高效的数据聚合:在单一请求中组合多个资源
  • 模式驱动(Schema-driven):类型系统定义操作、输入和输出

GraphQL 查询示例(单个 POST 请求):

1{
2  user(id: "123") {
3    name
4    email
5    orders(limit: 5) {
6      id
7      status}
8  }
9}

对比表:

特性REST APIGraphQL API
端点结构多个特定资源的 URI单一端点 (/graphql)
数据获取服务器定义客户端定义
API 版本控制版本化 URI (例如 /v1/)模式演进无需版本控制
过度获取/获取不足常见通过查询选择避免
缓存复杂性简单(按端点)复杂(按查询签名)
身份验证范围特定于端点特定于操作/查询

这种交互模式的根本转变影响了网关层流量管理、缓存和安全性的各个方面。

为什么 API 网关对 GraphQL 至关重要

尽管 GraphQL API 在运维上有所不同,但由于以下几个原因,API 网关仍然是现代系统中不可或缺的架构组件:

集中式流量管理

所有客户端请求在到达后端服务之前都会经过网关。这集中管理了:

  • 负载均衡
  • 限流
  • 路由决策
  • 故障转移与熔断

统一的安全实施

API 网关充当外部客户端和内部系统之间的安全边界,处理:

  • OAuth2 / OpenID Connect 身份验证
  • JWT 验证和基于声明的授权
  • IP 允许/拒绝名单
  • TLS 终止和强制 HTTPS

这对于 GraphQL 的单一端点尤为关键,因为后端服务不能再依赖 HTTP 方法或 URI 来区分访问策略。

1sequenceDiagram
2    participant Client
3    participant APISIX Gateway
4    participant Auth Server
5    participant GraphQL Backend
6
7    Client->>APISIX Gateway: POST /graphql 携带查询
8    APISIX Gateway->>Auth Server: 验证 JWT / OIDC Token
9    Auth Server-->>APISIX Gateway: Token 有效
10    APISIX Gateway->>APISIX Gateway: 解析 operationName
11    APISIX Gateway->>APISIX Gateway: 检查查询深度 / 复杂度
12    APISIX Gateway->>GraphQL Backend: 转发经过验证的查询
13    GraphQL Backend-->>APISIX Gateway: 响应
14    APISIX Gateway-->>Client: 返回数据

查询验证与保护

GraphQL 的灵活性使其容易受到以下威胁:

  • 资源耗尽(极深/嵌套的查询)
  • 通过内省查询或大型查询负载进行的拒绝服务(DoS)攻击
  • 通过无保护的查询结构导致未经授权的数据暴露

API 网关可以:

  • 强制执行查询复杂度和深度限制
  • 在生产环境中阻止内省查询
  • 限制最大查询大小或请求速率

缓存与性能优化

由于 GraphQL 中的缓存不如 REST 直接,网关可以:

  • 缓存规范化的查询签名
  • 优化频繁的低复杂度查询
  • 通过响应缓存或限流防止后端过载
1sequenceDiagram
2    participant Client
3    participant APISIX Gateway
4    participant Redis Cache
5    participant Backend
6
7    Client->>APISIX Gateway: POST /graphql 携带查询
8    APISIX Gateway->>APISIX Gateway: 生成查询哈希
9    APISIX Gateway->>Redis Cache: 检查缓存的响应
10    alt 缓存命中
11        Redis Cache-->>APISIX Gateway: 返回缓存数据
12        APISIX Gateway-->>Client: 缓存的响应
13    else 缓存未命中
14        APISIX Gateway->>APISIX Gateway: 检查限流
15        APISIX Gateway->>Backend: 转发请求
16        Backend-->>APISIX Gateway: 返回响应
17        APISIX Gateway->>Redis Cache: 按哈希存储响应
18        APISIX Gateway-->>Client: 最新响应
19    end

可观测性与监控

现代网关作为指标收集点,提供:

  • 查询性能洞察(延迟、大小、响应时间)
  • 按操作跟踪错误率
  • 集中式的 GraphQL API 交互请求和审计日志

后端抽象与服务组合

网关将客户端与后端服务拓扑解耦,实现:

  • 无需破坏客户端即可进行 API 版本管理
  • 路由到多个 GraphQL 服务器(微服务)
  • 协议转换(例如将 REST 或 gRPC 转换为 GraphQL)

如果没有网关,公开的 GraphQL API 将直接暴露,错失集中式的安全性、流量管理和监控——从而导致运维风险和低效。

微信咨询

获取方案