通常情况下,API 网关应连接应用服务、函数或受支持的服务 API,而不是直接连接数据库。服务层负责领域授权、事务、Schema 演进、连接池和稳定的 API 语义。把这些责任放进网关,会让公网流量处理与存储内部实现紧密耦合,并扩大网关配置的故障半径。
对于受控的只读查询或托管服务集成,少数例外可能合理,但仍需要有边界的数据契约、最小权限身份、连接池、超时、过载保护和明确迁移路径。“插件可以打开数据库连接”只代表技术上可行,并不等于架构上值得推荐。
核心要点
- 把事务型数据库访问留在拥有数据和业务规则的服务之后。
- 优先使用 HTTP、函数、工作流、队列或托管服务集成,让故障与授权契约保持可见。
- 绝不能根据不可信请求字段决定数据表、查询、租户或授权结果。
- 即使是直连只读路径,也需要连接上限、查询上限、缓存行为和 Schema 变更负责人。
- 上线前测试凭证缺失、连接池耗尽、数据库故障切换、慢查询、重复请求与回滚。
分开网关责任与数据责任
API 网关擅长请求准入和流量策略,例如 TLS 终止、认证、粗粒度授权、路由、配额、转换和可观测性。拥有数据的服务则负责领域不变量,例如调用方可以读取哪些行、某个状态转换是否合法,以及多次写入能否在同一事务中提交。
AWS 记录了 API Gateway 与 Lambda 函数、HTTP 端点、AWS 服务操作和 Mock 端点的集成。Apigee 把代理描述为一个门面,通过 TargetEndpoint 或后端服务转发请求。这些模式在网关和后端之间保留了明确协议契约,并不要求网关自己成为数据库客户端。
1flowchart LR
2 C[客户端] --> G[API 网关\n身份、准入与路由]
3 G --> S[领域服务\n授权与事务]
4 S --> D[(数据库)]
5 S --> Q[队列或工作流]
6 G --> O[网关遥测]
7 S --> A[领域审计]网关遥测记录请求路径,领域审计记录谁因何原因修改了哪个业务对象,二者不能互相替代。
直连数据库为何容易变得脆弱
领域授权进入了错误层级
经过验证的 Token 可以确定调用方身份,但通常不能证明其有权更新某一张发票、某个工作区或账户。如果网关代码把公网 X-Tenant-ID 请求头直接变成数据库查询条件,调用方就可能选择其他租户,除非可信认证逻辑先替换并验证这个值。
网关只应向服务传递最小化、自身生成的身份上下文。服务仍必须根据权威数据检查租户成员关系和对象所有权。
数据库连接变成请求路径容量
网关工作进程可以处理大量并发连接,而数据库连接通常稀缺得多。每个请求都新建或长时间占用数据库连接,可能在 CPU 或网络耗尽之前先耗光连接池。慢查询还会占用网关资源、提高延迟并放大重试。
应使用由服务负责的有界连接池、查询截止时间、并发限制和负载卸除。网关超时只代表不再等待,并不能证明数据库操作已经取消或回滚。
事务与重试失去上下文
网关可能重试特定上游请求,数据库驱动和应用则有各自的重试机制。如果没有幂等契约就重放写请求,操作可能重复执行。把事务拆进网关脚本,也会让原子性、补偿和审计归属更难推理。
写入重试和事务应留在领域服务中。只有方法和应用契约确认重放安全时,网关才应执行有界上游重试。
Schema 变更泄漏到公网边缘
如果路由中包含 SQL、列名或数据库专用错误处理,Schema 迁移就会变成网关发布。这会破坏稳定 API 边界,也迫使网关凭证拥有超出流量路由所需的访问权限。
选择更安全的模式
| 需求 | 推荐路径 | 原因 |
|---|---|---|
| 事务型读写 | 网关 → 领域服务 → 数据库 | 让授权、事务和 Schema 归属保持一致 |
| 短时 Serverless 操作 | 网关 → 函数 → 数据库 | 把数据库客户端和 IAM 策略与网关运行时隔离 |
| 长时间或突发写入 | 网关 → 服务 → 队列/工作流 → Worker | 将请求准入与处理容量解耦 |
| 公共、读多写少的参考数据 | 网关/CDN 缓存 → 读取 API 或物化视图 | 用明确的过期契约减轻数据库负载 |
| 云服务操作 | 受支持的网关服务集成 | 使用有文档的服务 API 和有限范围云身份 |
Amazon API Gateway HTTP API 文档把 Lambda 和可路由 HTTP 端点描述为后端路径。函数可以负责短时数据库交互,但仍需连接复用、并发控制、最小权限凭证和事务语义。
Apache APISIX 支持在请求阶段执行自定义逻辑和 Serverless 函数。这种扩展能力不会自动让网关工作进程成为任意数据库客户端的合适归宿。阻塞调用、机密信息、驱动生命周期和故障行为仍由运维方负责。
把例外当成产品,而不是捷径
只有同时满足以下条件时,才应考虑直连只读路径:
- 该路径对数据集只读;
- 查询集合固定并使用参数化查询;
- 凭证只能访问必要的视图或存储过程;
- 结果有明确大小、超时和缓存策略;
- 连接与查询并发限制低于数据库容量;
- 调用方不能随意选择表、列、租户或谓词;
- Schema 归属和回滚负责人明确;
- 故障会返回受控响应,不暴露驱动或 Schema 细节。
即使如此,一个小型读取服务通常也更容易测试、扩展、保护和替换。
推荐的 APISIX 边界
下面是配置片段,并非完整部署。它让 APISIX 3.18.0 保持在 HTTP 边界,并把库存请求交给负责数据库访问的服务:
1routes:
2 - id: inventory-api
3 uri: /inventory/*
4 methods: [GET]
5 upstream:
6 type: roundrobin
7 nodes:
8 "inventory-service.internal:8080": 1
9#END根据部署模式文档,在文件驱动的 standalone 模式中,完整 apisix.yaml 必须带有 #END 标记,APISIX 才会加载。这个片段特意不包含数据库地址或凭证。认证和限流插件应依据实际部署的身份契约添加。
在非生产环境中验证以下行为:
- 发送有效请求,确认数据库操作由服务记录,而不是由网关记录。
- 发送未认证请求,确认它在到达服务前被拒绝。
- 尝试传入调用方控制的租户请求头,确认它不能覆盖经过验证的身份上下文。
- 在测试环境耗尽数据库连接池,确认延迟有界、没有重试风暴且返回受控错误。
- 对数据库执行故障切换,确认进行中或重试的写操作仍符合应用幂等契约。
- 在测试环境部署不兼容 Schema 变更,确认服务仍能保护公网 API 契约。
生产检查清单
- 数据库是否隐藏在拥有 Schema 与不变量的服务之后?
- 服务是否重新检查租户与对象授权?
- 查询是否参数化、有界并设置截止时间?
- 连接池与请求并发是否协同定容?
- 在客户端或基础设施可能重试时,写入是否幂等?
- 凭证是否短期有效或可轮换、权限受限,并且不会出现在网关文件和日志中?
- Schema 变更和路由变更能否独立回滚?
- 网关遥测与领域审计事件能否关联,同时不把请求 ID 当成可信身份?
常见问题
API 网关在技术上能否连接数据库?
有些网关可以运行自定义代码并打开数据库连接,但这种能力不会自动提供领域授权、安全连接池、事务或 Schema 归属。
只读数据可以直连吗?
有时可以,但必须具备固定查询契约、最小权限、严格容量边界和明确 Schema 归属。读取服务或缓存通常仍是更安全的默认选择。
网关超时是否会取消数据库查询?
不一定。它可能只会让网关停止等待。取消操作和事务结果取决于服务、驱动、数据库和连接状态。
后续步骤
先设计安全的网关超时与重试,应用并发预算与背压,并明确细粒度授权归属,再对外暴露数据驱动 API。
