aws-doc/课程/第二阶段-核心服务/第19天-核心服务综合实战.md
2026-05-08 10:24:39 +08:00

183 lines
6.1 KiB
Markdown
Raw Permalink 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.

# 第19天核心服务综合实战——设计一个完整的应用架构
## 今天你将学到什么
今天是第二阶段的收尾。我们用一个完整的项目案例,把前面学到的所有核心服务串联起来,看看它们在真实架构中是怎么配合工作的。
---
## 项目背景:设计一个外卖点餐平台
假设你要做一个类似"美团外卖"的简化版平台:
- 用户可以浏览餐厅和菜品
- 用户可以下单、支付
- 商家可以接单、更新订单状态
- 用户可以实时查看订单进度
- 需要支持全国用户访问
---
## 架构全景图
```
用户手机/电脑
Route 53域名解析
CloudFront静态资源加速图片、前端页面
ALB负载均衡分发到多台服务器
Auto Scaling Group应用服务器自动伸缩
├── ElastiCache Redis缓存热门餐厅、菜品信息
├── Aurora MySQL用户信息、订单数据、商家信息
├── DynamoDB实时订单状态、骑手位置
├── S3菜品图片、商家 Logo、用户头像
└── SQS + Lambda异步处理发通知、更新统计
```
---
## 每个服务的角色
### Route 53 — 域名入口
- 用户输入 `www.waimai.com`
- Route 53 把域名解析到 CloudFront 的地址
- 配置健康检查:如果主站挂了,自动切到备用站
### CloudFront — 全球加速
- 缓存静态资源:菜品图片、前端 JS/CSS、商家 Logo
- 全国各地的用户都能快速加载页面
- 减轻源站压力(图片请求不用每次都打到服务器)
### ALB — 流量分发
- 把用户请求均匀分配给多台应用服务器
- 路径路由:`/api/orders/*` → 订单服务,`/api/restaurants/*` → 餐厅服务
- 健康检查:某台服务器挂了自动剔除
### Auto Scaling — 弹性伸缩
- 午餐高峰11:00-13:00自动扩展到 20 台服务器
- 凌晨低谷2:00-6:00自动缩减到 3 台服务器
- 策略CPU 使用率保持在 60%
### ElastiCache Redis — 缓存加速
- 缓存热门餐厅列表(避免每次都查数据库)
- 缓存用户会话(登录状态)
- 缓存菜品信息(菜品不会每秒都变)
- 效果:响应时间从 50ms 降到 5ms
### Aurora MySQL — 核心业务数据
- 存储:用户信息、商家信息、菜品详情、订单记录、支付记录
- Multi-AZ 部署:主库挂了自动切换到备库
- 2 个只读副本:分担查询压力
- 为什么选 Aurora需要复杂查询统计报表、搜索筛选
### DynamoDB — 实时数据
- 存储:订单实时状态(待接单→制作中→配送中→已送达)
- 存储:骑手实时位置(每 5 秒更新一次)
- 为什么选 DynamoDB更新频率极高、查询简单按订单 ID 查)、需要毫秒级响应
### S3 — 文件存储
- 菜品图片(商家上传)
- 用户头像
- 商家营业执照扫描件
- 配合 CloudFront 分发到全国
### SQS + Lambda — 异步处理
- 用户下单后 → 消息进入 SQS → Lambda 发送短信通知商家
- 订单完成后 → 消息进入 SQS → Lambda 更新用户积分
- 每日凌晨 → 定时触发 Lambda → 生成商家结算报表
---
## 网络设计
```
VPC (10.0.0.0/16)
├── 公有子网 (面向互联网)
│ ├── ALB
│ └── NAT Gateway
├── 应用子网 (私有)
│ └── EC2 应用服务器 (Auto Scaling)
└── 数据子网 (私有,最安全)
├── Aurora MySQL
├── ElastiCache Redis
└── (DynamoDB 和 S3 通过 VPC Endpoint 访问,不走公网)
```
**安全组规则**
- ALB只允许 80/443 端口的外部流量
- 应用服务器:只允许来自 ALB 的流量
- 数据库:只允许来自应用服务器的流量
- 层层隔离,外部用户永远接触不到数据库
---
## 一个请求的完整旅程
用户打开 APP浏览附近的餐厅
1. APP 请求 `api.waimai.com/restaurants?lat=39.9&lng=116.4`
2. Route 53 解析域名 → CloudFront 地址
3. CloudFront 发现这是 API 请求(不缓存)→ 转发到 ALB
4. ALB 选择一台健康的应用服务器
5. 应用服务器先查 Redis 缓存:有附近餐厅的数据吗?
- 有(缓存命中)→ 直接返回,耗时 5ms
- 没有(缓存未命中)→ 查 Aurora 数据库 → 结果写入 Redis → 返回
6. 响应经过 ALB → CloudFront → 到达用户 APP
整个过程50-200ms。用户感觉"秒开"。
---
## 成本估算(月)
| 服务 | 配置 | 月费估算 |
|------|------|----------|
| EC2 (Auto Scaling) | 3-20 台 t3.large | ¥2,000-5,000 |
| Aurora | db.r6g.large + 2 只读副本 | ¥4,000 |
| ElastiCache | 2 节点 cache.r6g.large | ¥3,000 |
| DynamoDB | 按需模式 | ¥500-2,000 |
| S3 | 500GB 图片 | ¥100 |
| CloudFront | 2TB 流量 | ¥1,500 |
| 其他 | ALB、NAT、Route53 | ¥1,000 |
| **总计** | | **¥12,000-17,000/月** |
对于一个日活几万用户的平台来说,这个成本是合理的。
---
## 关键设计决策总结
| 决策 | 选择 | 原因 |
|------|------|------|
| 主数据库 | Aurora MySQL | 需要复杂查询、事务、报表 |
| 实时数据 | DynamoDB | 高频更新、简单查询、毫秒响应 |
| 缓存 | Redis | 减少数据库压力、加速响应 |
| 文件存储 | S3 + CloudFront | 图片多、需要全国加速 |
| 异步处理 | SQS + Lambda | 解耦、削峰、按需付费 |
| 伸缩策略 | Auto Scaling | 应对午餐/晚餐高峰 |
---
## 今天的小测验
1. 为什么这个架构同时用了 Aurora 和 DynamoDB 两种数据库?
2. 如果不用 CloudFront用户体验会有什么变化
3. 为什么"发通知"这个操作要用 SQS 异步处理,而不是下单时同步发送?
4. 如果午餐高峰期流量突然暴涨 5 倍,这个架构的哪些部分会自动应对?
---
## 延伸阅读
- [AWS 架构中心](https://aws.amazon.com/architecture/)
- [AWS Well-Architected Labs](https://wellarchitectedlabs.com/)
---
## 明天预告
进入第三阶段:安全与身份。明天深入学习 IAM 策略的编写——用精确的规则控制"谁能对什么资源做什么操作"。