主题
阶段 4 练习题:大师级 - 生产级应用开发
📋 练习说明
本阶段包含 30 个高难度练习题,涵盖微服务架构、数据库、安全、DevOps、前端高级技术和系统设计。这些练习题将巩固你在本阶段学到的所有知识,帮助你具备开发生产级应用的能力。
完成建议:
- 建议每天完成 2-3 道题
- 每道题都要动手实现,不要只看不做
- 遇到困难先自己思考,再查阅资料
- 完成后进行代码审查,寻找改进空间
1. 微服务架构(6 题)
练习 1.1:服务拆分设计 ⭐⭐⭐⭐
题目: 设计一个在线教育平台的微服务架构,包含以下功能模块:
- 用户管理(学生、教师、管理员)
- 课程管理(课程信息、章节、资源)
- 订单和支付
- 学习进度跟踪
- 评论和评分
- 直播课程
- 消息通知
要求:
- 识别并定义各个微服务
- 绘制服务依赖关系图
- 定义服务间通信方式(同步/异步)
- 设计数据库策略(每个服务独立数据库)
- 说明如何处理分布式事务
练习 1.2:API 网关实现 ⭐⭐⭐⭐⭐
题目: 实现一个功能完整的 API 网关,支持:
- 请求路由(根据 URL 路径路由到不同服务)
- 负载均衡(轮询、随机、最少连接)
- 认证和授权(JWT)
- 限流(固定窗口、滑动窗口、令牌桶)
- 断路器模式
- 请求/响应日志
- 性能监控(响应时间、错误率)
参考答案位置:examples/api-gateway/
练习 1.3:服务发现实现 ⭐⭐⭐⭐
题目: 实现一个简单的服务注册中心,功能包括:
- 服务注册和注销
- 服务发现(根据服务名查找所有实例)
- 健康检查(定期检查服务健康状态)
- 自动移除不健康的服务实例
练习 1.4:分布式追踪 ⭐⭐⭐⭐
题目: 为一个微服务系统添加分布式追踪功能:
- 生成全局唯一的 Trace ID
- 在服务间调用时传递追踪上下文
- 记录每个服务的处理时间
- 将追踪数据发送到 Jaeger 或 Zipkin
练习 1.5:Saga 模式实现 ⭐⭐⭐⭐⭐
题目: 实现一个电商下单的 Saga 流程:
- 创建订单
- 预留库存
- 扣减用户余额
- 发起支付
- 如果任何步骤失败,执行补偿事务回滚
要求:
- 实现编排式 Saga(中央协调器)
- 记录 Saga 状态到数据库
- 实现补偿逻辑
- 处理并发和幂等性
练习 1.6:消息队列应用 ⭐⭐⭐⭐
题目: 使用 RabbitMQ 或 Kafka 实现一个事件驱动的订单系统:
- 订单服务发布
order.created事件 - 库存服务订阅并扣减库存
- 通知服务订阅并发送邮件
- 积分服务订阅并增加积分
要求:
- 保证消息至少被消费一次
- 实现消息重试机制
- 处理死信队列
2. 数据库和 ORM(6 题)
练习 2.1:数据库设计 ⭐⭐⭐⭐
题目: 设计一个社交网络的数据库模式,包含:
- 用户(个人信息、隐私设置)
- 好友关系(双向好友)
- 帖子(文字、图片、视频)
- 评论(支持回复)
- 点赞
- 消息(一对一聊天)
要求:
- 绘制 ER 图
- 创建表结构(SQL)
- 添加必要的索引
- 考虑查询性能(如 Feed 流生成)
- 处理数据一致性问题
练习 2.2:查询优化 ⭐⭐⭐⭐⭐
题目: 给定一个慢查询,进行优化:
sql
SELECT
u.id,
u.name,
u.email,
COUNT(DISTINCT o.id) as order_count,
COUNT(DISTINCT r.id) as review_count,
AVG(p.amount) as avg_payment
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
LEFT JOIN reviews r ON u.id = r.user_id
LEFT JOIN payments p ON o.id = p.order_id
WHERE u.created_at > '2024-01-01'
AND o.status = 'completed'
GROUP BY u.id, u.name, u.email
HAVING COUNT(DISTINCT o.id) > 5
ORDER BY avg_payment DESC
LIMIT 100;要求:
- 使用 EXPLAIN ANALYZE 分析查询
- 识别性能瓶颈
- 添加合适的索引
- 重写查询(可能拆分为多个查询)
- 考虑使用物化视图
练习 2.3:ORM 实现 ⭐⭐⭐⭐
题目: 使用 Prisma 或 TypeORM 实现一个博客系统:
- 用户和文章的一对多关系
- 文章和标签的多对多关系
- 文章和评论的一对多关系(支持嵌套评论)
- 软删除功能
- 分页查询(光标分页)
练习 2.4:数据库迁移 ⭐⭐⭐
题目: 实现以下数据库迁移场景:
- 添加新列(带默认值)
- 修改列类型(字符串 → 枚举)
- 拆分表(用户表拆分为用户基础信息和用户详情)
- 数据迁移(将旧数据转换为新格式)
要求:
- 零停机迁移
- 可回滚
- 数据完整性验证
练习 2.5:MongoDB 聚合 ⭐⭐⭐⭐
题目: 使用 MongoDB 聚合管道实现以下查询:
- 按月统计订单数量和总金额
- 找出销量前 10 的商品
- 计算每个用户的消费总额并排名
- 分析用户购买行为(最常购买的商品类别)
练习 2.6:读写分离 ⭐⭐⭐⭐
题目: 实现 PostgreSQL 的读写分离:
- 写操作路由到主库
- 读操作路由到从库(支持多个从库的负载均衡)
- 处理主从延迟问题
- 实现故障转移(主库宕机时提升从库)
3. 安全(5 题)
练习 3.1:完整的认证系统 ⭐⭐⭐⭐⭐
题目: 实现一个完整的认证系统,包含:
- 用户注册(邮箱验证)
- 用户登录(JWT)
- 密码重置(邮件链接)
- Token 刷新(Refresh Token)
- 登出(Token 黑名单)
- 双因素认证(TOTP)
参考答案位置:examples/auth-system/
练习 3.2:RBAC 权限系统 ⭐⭐⭐⭐⭐
题目: 实现一个 RBAC 权限系统:
- 定义用户、角色、权限的数据模型
- 实现权限检查中间件
- 支持权限继承(角色层级)
- 动态权限分配
- 提供管理界面(API)
练习 3.3:安全漏洞修复 ⭐⭐⭐⭐
题目: 给定一个有安全漏洞的应用代码,识别并修复以下漏洞:
- SQL 注入
- XSS(存储型和反射型)
- CSRF
- 不安全的密码存储
- 敏感信息泄露
- 不安全的文件上传
练习 3.4:API 限流实现 ⭐⭐⭐⭐
题目: 实现一个分布式限流系统:
- 支持多种限流算法(固定窗口、滑动窗口、令牌桶)
- 使用 Redis 存储计数器
- 支持不同粒度的限流(IP、用户、API Key)
- 提供限流配置 API
- 返回剩余配额信息
练习 3.5:OAuth 2.0 实现 ⭐⭐⭐⭐⭐
题目: 实现一个 OAuth 2.0 授权服务器:
- 支持授权码模式
- 客户端注册和管理
- 授权页面
- Token 生成和验证
- Token 刷新
- Scope 权限控制
4. DevOps 和部署(6 题)
练习 4.1:Dockerfile 优化 ⭐⭐⭐⭐
题目: 优化以下 Dockerfile,减小镜像体积并提升构建速度:
dockerfile
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3000
CMD ["node", "dist/main.js"]要求:
- 使用多阶段构建
- 使用 alpine 基础镜像
- 优化层缓存
- 添加 .dockerignore
- 非 root 用户运行
练习 4.2:Kubernetes 部署 ⭐⭐⭐⭐⭐
题目: 在 Kubernetes 上部署一个完整的应用,包含:
- 前端(React)
- 后端 API(Node.js)
- 数据库(PostgreSQL)
- 缓存(Redis)
要求:
- 编写 Deployment、Service、Ingress 配置
- 使用 ConfigMap 和 Secret 管理配置
- 配置健康检查和就绪探针
- 实现水平自动扩展(HPA)
- 配置持久化存储(PVC)
参考答案位置:examples/k8s-deployment/
练习 4.3:CI/CD 流水线 ⭐⭐⭐⭐⭐
题目: 使用 GitHub Actions 构建完整的 CI/CD 流水线:
- 代码检查(ESLint, Prettier)
- 运行测试(单元测试、集成测试)
- 构建 Docker 镜像
- 推送镜像到 Registry
- 部署到 Kubernetes(测试环境自动部署,生产环境人工审批)
- 运行 E2E 测试
- 通知(Slack/邮件)
练习 4.4:监控系统搭建 ⭐⭐⭐⭐
题目: 搭建一个完整的监控系统:
- 使用 Prometheus 收集应用指标
- 使用 Grafana 创建仪表板
- 配置告警规则(CPU、内存、错误率)
- 集成 Alertmanager 发送告警
- 添加自定义业务指标
练习 4.5:日志聚合系统 ⭐⭐⭐⭐
题目: 搭建 ELK Stack 日志系统:
- 配置 Filebeat 收集日志
- 使用 Logstash 处理和转换日志
- 存储日志到 Elasticsearch
- 使用 Kibana 查询和可视化
- 创建日志告警
练习 4.6:蓝绿部署 ⭐⭐⭐⭐
题目: 实现蓝绿部署策略:
- 同时运行两个版本的应用(蓝色和绿色)
- 流量路由到当前版本
- 部署新版本到空闲环境
- 测试新版本
- 切换流量到新版本
- 保留旧版本以便回滚
5. 前端高级(4 题)
练习 5.1:性能优化 ⭐⭐⭐⭐⭐
题目: 优化一个性能较差的 React 应用:
- 分析性能瓶颈(使用 React DevTools Profiler)
- 实现代码分割(路由级别和组件级别)
- 优化图片加载(懒加载、响应式图片、WebP)
- 减少重渲染(React.memo, useMemo, useCallback)
- 实现虚拟列表(react-window)
- 优化包体积(Tree Shaking、动态导入)
目标:
- LCP < 2.5s
- FID < 100ms
- CLS < 0.1
- 包体积减少 50%
练习 5.2:状态管理 ⭐⭐⭐⭐
题目: 使用 Redux Toolkit 或 Zustand 实现一个购物车系统:
- 添加/删除商品
- 更新商品数量
- 计算总价(含优惠)
- 持久化到 localStorage
- 乐观更新(先更新 UI,再同步到服务器)
练习 5.3:SSR 实现 ⭐⭐⭐⭐⭐
题目: 使用 Next.js 实现一个博客:
- 文章列表(SSG)
- 文章详情(SSR)
- 评论功能(Client-side)
- SEO 优化(Meta 标签、Sitemap)
- 图片优化(Next.js Image)
练习 5.4:可访问性改进 ⭐⭐⭐⭐
题目: 改进一个表单的可访问性:
- 添加正确的 ARIA 属性
- 实现键盘导航(Tab、Enter、Escape)
- 添加表单验证和错误提示
- 确保颜色对比度符合 WCAG AA 标准
- 使用屏幕阅读器测试
6. 系统设计(3 题)
练习 6.1:设计 Twitter ⭐⭐⭐⭐⭐
题目: 设计一个类似 Twitter 的社交媒体平台:
功能需求:
- 发布推文(280 字符)
- 关注用户
- Home Timeline(显示关注用户的推文)
- 点赞和转发
- @提及和话题标签
非功能需求:
- 日活用户:200M
- 每用户每天发 2 条推文
- 读写比:100:1
- 推文延迟:< 5s
要求:
- 容量估算
- API 设计
- 数据库设计
- Feed 生成策略(推模式 vs 拉模式)
- 缓存策略
- 扩展性方案
练习 6.2:设计视频流媒体平台 ⭐⭐⭐⭐⭐
题目: 设计一个类似 YouTube 的视频平台:
- 视频上传和转码
- 视频播放(支持不同清晰度)
- 推荐算法
- 评论和点赞
- 订阅和通知
考虑点:
- CDN 设计
- 视频存储和编码
- 流媒体协议(HLS、DASH)
- 推荐系统
- 缓存策略
练习 6.3:设计分布式缓存 ⭐⭐⭐⭐⭐
题目: 设计一个分布式缓存系统(类似 Redis):
- 支持基本操作(GET、SET、DELETE)
- 支持过期时间
- 一致性哈希分片
- 主从复制
- 持久化(RDB、AOF)
📝 自我评估
完成练习后,使用以下标准评估自己:
- [ ] 能够独立设计微服务架构
- [ ] 能够优化数据库查询性能
- [ ] 能够实现安全的认证授权系统
- [ ] 能够使用 Docker 和 Kubernetes 部署应用
- [ ] 能够构建 CI/CD 流水线
- [ ] 能够优化前端性能
- [ ] 能够设计大规模系统
恭喜完成阶段 4 的所有练习!你已经具备了开发生产级应用的能力! 🎉