第4章 分布式系统设计与微服务架构

本章聚焦微服务拆分原则、RPC通信与注册中心选型、分布式事务方案及容错机制。面试中高频考察候选人对业务边界划分、跨服务一致性、以及异常场景下系统韧性的理解。以下结构化问答与项目模板可直通大厂高频考点。

核心能力画像: 服务边界设计 → 通信协议选型(gRPC/Thrift) → 注册中心高可用(Nacos/Consul) → 分布式事务方案(2PC/TCC/Saga) → 熔断降级(Hystrix/Sentinel)
服务拆分与RPC回答框架 按业务领域拆分 独立部署与扩展 注册中心选型 服务发现与健康检查 负载均衡与容错

▲ 回答框架:从拆分原则到注册中心、负载均衡与容错,层层递进

面试问答卡片(3题)

1. 你是如何划分微服务边界的?具体依据什么原则?

🎯 考察点: 领域驱动设计(DDD)实践能力、业务抽象思维、对高内聚低耦合的理解。

📋 回答框架: 先强调“业务领域驱动”,推荐使用DDD限界上下文划分 → 举例用户、订单、支付三个服务 → 附带数据独立性原则(每个服务拥有自己的数据库) → 补充拆分后如何通过API网关对外暴露。

🔍 简短示例回答: “我采用DDD限界上下文来划分服务边界。例如电商项目中,将订单与支付拆分,因为两者变更频率不同且业务语义独立。每个服务拥有独立数据库,通过gRPC通信,确保高内聚低耦合。同时引入API网关统一入口,减少客户端耦合。”

❓ 可能追问: 如果业务边界模糊怎么办?拆分后如何保证数据一致性?

⚠️ 避坑提醒: 切忌按技术层(如Controller/Service/DAO)拆分服务;不要过度拆分或过早拆分,优先考虑团队结构和业务变化频率。
2. 你选型RPC框架和注册中心的依据是什么?遇到过什么坑?

🎯 考察点: 对主流RPC(gRPC/Thrift/Dubbo)和注册中心(Nacos/Consul/Eureka)原理的掌握、生产环境选型权衡。

📋 回答框架: 对比序列化效率(Protobuf vs JSON) → 语言生态(Python优先选gRPC) → 注册中心对比CP/AP模型(Consul偏CP,Nacos可切换) → 实践经验:健康检查机制、客户端缓存降级。

🔍 简短示例回答: “我选择gRPC作为RPC,因为Protobuf序列化性能高且跨语言。注册中心选用Nacos,因为它支持CP/AP模式切换,满足不同场景需求。曾遇到注册中心网络分区导致服务列表不一致,最终采用短连接健康检查+本地缓存降级解决。”

❓ 可能追问: gRPC连接池如何管理?注册中心挂了如何处理?

⚠️ 避坑提醒: 不要直接在生产使用无服务发现的直连模式;注意注册中心心跳超时参数调优,避免大规模虚假下线。
3. 你们业务中采用了哪种分布式事务方案?如何保证最终一致性?

🎯 考察点: 分布式事务理论(CAP/BASE)、实际方案选型(2PC/TCC/Saga/消息表)、异常处理经验。

📋 回答框架: 先分析业务场景(强一致性 vs 最终一致性) → 举例TCC(预留→确认/取消)或异步消息(可靠消息+本地事件表) → 强调幂等性设计和补偿机制 → 结合Seata或自研实现。

🔍 简短示例回答: “在订单支付场景,我们采用TCC模式。Try阶段冻结库存和账户资金,Confirm阶段实际扣减,Cancel阶段回滚。使用Seata AT模式减少侵入性。另外对消息型事务,使用本地消息表+定时轮询确保最终一致性,配合对账系统兜底。”

❓ 可能追问: TCC空回滚如何处理?事务日志清理策略?

⚠️ 避坑提醒: 避免使用全局XA(2PC)在高并发场景;务必实现幂等和防悬挂机制;事务日志不要无限堆积,需设计清理策略。
分布式事务方案选择 强一致性需求 XA / 2PC 最终一致性可接受 TCC / Saga 异步消息 + 本地表

▲ 根据业务对一致性的容忍度选择对应方案,注意高并发场景优先选最终一致性

项目案例模板:高并发电商交易平台微服务重构

项目名称高并发电商交易平台微服务化与分布式事务改造
业务背景原有单体订单系统在双11大促时频繁超时、数据不一致,团队决定采用微服务架构拆分订单、库存、支付、物流四个核心服务。
规模指标日均订单量50万+,峰值QPS 8000+;服务数从1个拆为12个;跨服务事务占比约30%。
技术栈Python + FastAPI + gRPC + Nacos + PostgreSQL(分库分表) + Kafka + Sentry + Prometheus
核心难点
  • 库存扣减与订单创建间的分布式事务一致性,延迟敏感(<200ms)。
  • 注册中心网络分区导致部分节点服务列表不一致。
  • 幂等性设计与重试风暴防止。
面试高频追问
  1. 你们为什么选Saga而非TCC?
  2. 如何保证消息不丢不重?
  3. 注册中心挂掉后,服务间通信如何降级?
  4. 分库分表后跨节点事务如何处理?
可迁移回答话术
💡 话术示例: “我们优先使用Saga编排模式,因为订单创建是长事务且需要异步补偿。通过Kafka可靠消息+本地事件表保证最终一致性,配合对账任务兜底。注册中心挂了时,客户端缓存在启动时拉取的全量服务列表,并自动降级为直连模式,同时触发告警。”
📌 第4章小结: 微服务架构面试重点在于边界划分、通信协议选型、一致性方案权衡以及故障场景的韧性设计。熟练使用DDD、gRPC、Nacos、Seata等工具并总结生产踩坑经验,是高分关键。