aws-doc/课程/第四阶段-应用架构/第30天-APIGateway.md
2026-05-08 10:24:39 +08:00

230 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第30天API Gateway——统一的 API 入口
## 今天你将学到什么
今天学习 API Gateway——AWS 的 API 管理服务。它是你后端服务的"大门",负责接收客户端请求、验证身份、限制流量、路由到正确的后端服务。
---
## 为什么需要 API Gateway
### 没有 API Gateway 的问题
假设你有一个微服务架构,有多个后端服务:
```
手机 APP 直接调用:
→ 用户服务(端口 8001
→ 订单服务(端口 8002
→ 商品服务(端口 8003
→ 支付服务(端口 8004
```
**问题**
- 客户端需要知道每个服务的地址(耦合)
- 每个服务都要自己实现认证、限流、日志(重复)
- 服务地址变了,所有客户端都要更新
- 没有统一的监控和管理
### 有 API Gateway 的世界
```
手机 APP → API Gateway统一入口
├── /users/* → 用户服务
├── /orders/* → 订单服务
├── /products/* → 商品服务
└── /payments/* → 支付服务
```
**类比**API Gateway 就像酒店的前台。客人(客户端)不需要知道每个部门(后端服务)在哪里,只需要告诉前台需要什么,前台帮你转接到正确的部门。前台还负责验证你的身份(房卡)、记录你的请求。
---
## API Gateway 能做什么
| 功能 | 说明 | 好处 |
|------|------|------|
| 请求路由 | 根据 URL 路径转发到不同后端 | 客户端只需要一个地址 |
| 身份认证 | 验证 API 密钥、JWT Token、IAM 签名 | 后端不用重复实现认证 |
| 请求限流 | 限制每秒请求数,防止滥用 | 保护后端不被压垮 |
| 请求转换 | 修改请求/响应的格式 | 适配不同客户端需求 |
| 缓存 | 缓存 API 响应 | 减少后端压力,加速响应 |
| CORS | 处理跨域请求 | 前端可以直接调用 API |
| API 版本管理 | 支持 v1、v2 等多个版本共存 | 平滑升级,不影响老用户 |
| 监控 | 请求量、延迟、错误率 | 了解 API 使用情况 |
---
## AWS API Gateway 的三种类型
| 类型 | 适合场景 | 特点 |
|------|----------|------|
| REST API | 功能最全的 RESTful API | 支持所有功能,价格稍高 |
| HTTP API | 简单的 HTTP 代理 | 功能较少但便宜 70%,延迟更低 |
| WebSocket API | 实时双向通信 | 聊天、实时通知、游戏 |
**选择建议**
- 大多数场景用 HTTP API便宜、快
- 需要请求转换、缓存、API 密钥计划等高级功能用 REST API
- 需要实时推送用 WebSocket API
---
## API Gateway + Lambda无服务器 API
最经典的组合API Gateway 接收请求Lambda 处理逻辑。
```
客户端 → API Gateway → Lambda 函数 → DynamoDB
→ S3
→ 其他服务
```
**优势**
- 完全无服务器,不需要管理任何机器
- 按请求付费,没有请求就不花钱
- 自动扩展,能应对突发流量
**适合**
- 中小型 API
- 流量不稳定的应用
- 快速原型开发
---
## 认证与授权
API Gateway 支持多种认证方式:
### 方式一API 密钥
最简单的方式。给每个客户端分配一个 API Key。
```
客户端请求头x-api-key: abc123xyz
```
适合:内部服务间调用、简单的第三方集成。
### 方式二Cognito 用户池
AWS 的用户管理服务。用户登录后获得 JWT TokenAPI Gateway 自动验证。
```
用户登录 → Cognito 返回 Token → 客户端带着 Token 请求 API → API Gateway 验证 Token
```
适合面向终端用户的应用APP、网站
### 方式三Lambda 授权器
自定义认证逻辑。API Gateway 收到请求后,先调用一个 Lambda 函数验证身份。
```
客户端请求 → API Gateway → Lambda 授权器(验证 Token
├── 验证通过 → 转发到后端
└── 验证失败 → 返回 401
```
适合:需要自定义认证逻辑(比如验证自己系统的 Token
---
## 限流与配额
### 为什么要限流
- 防止恶意用户刷接口
- 防止 bug 导致的无限循环调用
- 保护后端服务不被压垮
- 公平分配资源给所有用户
### API Gateway 的限流机制
| 级别 | 说明 | 举例 |
|------|------|------|
| 账户级别 | 整个账户的默认限制 | 10,000 请求/秒 |
| API 级别 | 单个 API 的限制 | 5,000 请求/秒 |
| 方法级别 | 单个接口的限制 | /login 限制 100 请求/秒 |
| 客户端级别 | 单个 API Key 的限制 | 每个客户端 1,000 请求/秒 |
### 使用计划Usage Plan
可以为不同的客户端设置不同的配额:
```
免费用户:每天 1,000 次调用,每秒最多 10 次
付费用户:每天 100,000 次调用,每秒最多 100 次
企业用户:无限调用,每秒最多 1,000 次
```
---
## API 版本管理
### 为什么需要版本
你的 API 已经有很多客户端在用了。现在要改接口格式,但不能让老客户端突然不能用。
### 实现方式
**方式一URL 路径版本**
```
https://api.example.com/v1/users ← 老版本
https://api.example.com/v2/users ← 新版本
```
**方式二阶段Stage**
API Gateway 支持多个"阶段",每个阶段是一个独立的部署:
```
https://api.example.com/dev/users ← 开发环境
https://api.example.com/test/users ← 测试环境
https://api.example.com/prod/users ← 生产环境
```
---
## 实际架构示例
### 一个完整的无服务器后端
```
移动 APP / Web 前端
CloudFront缓存静态资源
API GatewayAPI 入口)
├── GET /products → Lambda → DynamoDB查询商品
├── POST /orders → Lambda → DynamoDB + SQS创建订单
├── GET /users/me → Lambda → RDS查询用户信息
└── POST /upload → Lambda → S3上传文件
Cognito用户认证
```
**成本**:如果每天 10 万次 API 调用,月费大约只有几美元。
---
## 今天的小测验
1. API Gateway 解决了什么问题?没有它会怎样?
2. REST API 和 HTTP API 的区别是什么?怎么选?
3. API Gateway 支持哪些认证方式?各自适合什么场景?
4. 为什么需要 API 限流?可以在哪些级别设置限流?
---
## 延伸阅读
- [API Gateway 开发者指南](https://docs.aws.amazon.com/apigateway/latest/developerguide/)
- [API Gateway REST API vs HTTP API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html)
- [使用 Cognito 保护 API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html)
---
## 明天预告
明天学习微服务架构——如何把一个大应用拆分成多个小服务,以及 AWS 上实现微服务的最佳实践。