aws-doc/课程/第四阶段-应用架构/第30天-APIGateway.md

230 lines
6.8 KiB
Markdown
Raw Normal View History

2026-05-08 10:24:39 +08:00
# 第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 上实现微服务的最佳实践。