
1) 【一句话结论】在参与的教育类项目(假设为“智慧校园选课系统”)中,从单体架构迁移到微服务架构的核心是通过业务能力拆分服务、采用分布式数据库分库分表、gRPC优化通信、Saga模式保障数据一致性,解决了单体扩展性差的问题,最终实现服务独立扩容与系统弹性提升。
2) 【原理/概念讲解】老师口吻解释:单体架构是将用户管理、课程管理、选课等模块打包成一个应用,像“一个整体蛋糕”,部署、扩展时需整体调整,初期开发效率高但扩展性差。微服务架构则是将系统拆分为独立服务(如用户服务、课程服务、选课服务),每个服务负责单一业务能力,服务间通过API通信,像“多个独立小蛋糕”,每个小蛋糕可独立部署、扩展,但通过盘子(服务间通信)协作。关键点包括服务独立部署、技术异构(如用户服务用Java,选课服务用Go)。
3) 【对比与适用场景】
| 特性 | 单体架构 | 微服务架构 |
|---|---|---|
| 定义 | 所有功能模块部署在单一应用中 | 系统拆分为多个独立服务,每个服务负责单一业务能力 |
| 特性 | 部署简单,初期开发效率高(模块内逻辑集中) | 部署复杂,初期开发效率低(需管理多个服务) |
| 使用场景 | 小型系统(用户<1000)、业务简单 | 中大型系统(用户>1000)、业务复杂、需要高扩展性 |
| 注意点 | 扩展性差(整体扩展),维护复杂 | 服务拆分粒度难(过度拆分导致通信成本高),数据一致性难 |
4) 【示例】
假设项目是“智慧校园选课系统”,单体架构时,用户注册、课程信息、选课流程都在一个Java应用中。迁移时,拆分为:
服务间通信:用户服务调用选课服务时用gRPC(配置示例:grpc-transport-http2开启HTTP/2,grpc-compress-gzip启用头部压缩)。
Saga模式补偿流程(伪代码):
// 选课流程:用户服务创建订单 → 课程服务扣减库存 → 支付成功则更新订单状态
// 补偿事务:支付失败则回滚库存
if (paymentFailed) {
// 发送补偿消息回滚库存
sendCompensationMessage(courseId, inventory, originalInventory)
}
5) 【面试口播版答案】(约90秒):“我参与过一个教育类项目,从单体架构迁移到微服务架构。核心是通过业务能力拆分服务,比如用户、课程、选课拆分为独立服务。遇到的主要挑战是服务拆分粒度(比如选课逻辑是否单独服务)和跨服务通信(REST延迟),还有数据一致性(选课扣库存失败后库存未回滚)。解决方案是:服务拆分遵循单一职责,用领域驱动设计划分边界;跨服务通信采用gRPC(基于HTTP/2,支持头部压缩,比REST高效);数据一致性用Saga模式,通过消息队列异步通知,支付失败时回滚库存。迁移后,用户服务可独立扩容,响应时间从500ms减少到150ms,系统弹性提升。”
6) 【追问清单】
7) 【常见坑/雷区】