前段时间看到一篇软考培训的文章,把微服务架构划分成了 6 种模式:代理、聚合、链式、分支、数据共享、异步消息。
说实话,这种分类我之前还真没见过。平时做项目,更多是直接上手:网关、BFF、服务拆分、消息队列……但很少从"模式"这个角度去归类。
看完之后,我第一反应是:这种分类合理吗?在真实项目里,这 6 种模式到底怎么落地?
毕竟,理论归理论,工程归工程。软考中"链式模式"画个流程图很简单,但真实项目里,链式调用最容易出问题:超时没设、重试乱用、一个服务抖动全链路雪崩……
所以,我决定用电商下单-支付-履约这个典型场景,把这 6 种模式在工程上分别对应什么、怎么组合、怎么避坑,都梳理一遍。
六种模式不是六选一
更工程化的理解是:它们更像"服务交互/集成方式"的归类,不互斥,真实系统里常常同时出现:
- • API Gateway:统一入口与治理
- • BFF / 聚合层:多端适配与接口拼装
- • 同步调用链:核心链路快速反馈
- • 分支与编排:复杂流程的策略路由/工作流
- • 共享库(过渡):拆服务过程中的阶段性产物
- • 事件驱动 / MQ:解耦、削峰、最终一致
需要根据业务场景灵活组合使用。
电商架构组合案例
典型的电商微服务架构通常包含以下层次:
- • 客户端层:Web/App
- • 网关层:API 网关(鉴权、限流、路由、灰度)
- • 聚合层:Web-BFF / App-BFF(聚合商品、评价、活动等)
- • 核心服务层:订单、库存、支付
- • 履约层:物流服务(普通/冷链/同城)分支
- • 消息层:MQ 事件驱动(支付结果事件 → 通知、推送、积分、对账等)
1)代理模式:API Gateway
它解决什么问题? 让所有客户端先过一个“门”,统一做:鉴权、限流、黑白名单、灰度路由、协议转换、熔断降级等。
电商里典型落点
- • 登录态校验、风控拦截
- • 秒杀/大促限流
- • 灰度发布(按用户、地域、版本分流到新旧后端)
一个很关键的边界
- • ✅ 网关做"横切能力"(安全、流量、路由)
- • ❌ 不要在网关写业务拼装、业务规则
写进网关的业务逻辑,后面一定会变成"改一次全端受影响",迭代速度直线下降。
2)聚合模式:BFF 聚合层
它解决什么问题? 页面往往要同时展示:商品详情、价格、库存、评价、活动信息……如果让前端分别调 5~10 个接口,体验和维护都会变差。
工程上更常见的做法:BFF
- • Web-BFF:面向网页页面
- • App-BFF:面向移动端页面
端差异越大,越建议分 BFF。不要指望"一个聚合服务搞定所有端",它容易膨胀成第二个单体。
电商里典型接口:商品详情页
- • BFF 并行调用:商品服务、库存服务、评价服务、营销服务
- • 做字段裁剪、聚合返回
聚合层必须带的三件事
-
- 并行调用:不要串行拼装,否则总耗时 = 各服务耗时之和
-
- 超时控制:下游慢就降级,避免一个慢服务拖死整个接口
-
- 降级兜底:评价挂了不影响商品主信息返回,保证核心数据可用
3)链式模式:同步调用链
软考中"链式模式"看起来像流程图:一个接一个调用。 工程里真正要解决的是:链路韧性,否则级联故障分分钟出现。
电商核心链路(示例)
-
- 创建订单(订单服务)
-
- 预占/校验库存(库存服务)
-
- 发起支付(支付服务)
-
- 返回下单/支付结果给用户(需要快速反馈)
链式调用最容易翻车的点
- • 超时没设:下游卡住拖死上游线程
- • 重试乱用:导致库存/支付“重复扣减”
- • 依赖太深:一个服务抖动,全链路雪崩
落地必做
- • 每跳超时 + 熔断 + 隔离:线程池/舱壁隔离,避免级联故障
- • 写操作必须幂等:幂等键/业务单号,防止重复扣减
- • 失败要有补偿思路:别只会抛异常,要有回滚/补偿机制
4)分支模式:规则分支
在电商里,“支付完成后怎么发货”通常不是一条直线:
- • 普通商品走普通快递
- • 生鲜走冷链
- • 同城订单走即时配送
这就是分支模式最典型的业务语境:规则多、变化快、要可配置。
一个工程化建议
不要把"分支规则"长期写死在支付服务/订单服务里,否则核心服务会越来越臃肿,发布风险变大。
更合理的方向是:
- • 抽一个策略服务(或规则引擎/工作流引擎)
- • 核心服务只负责发起"履约决策请求"
- • 决策服务返回选择的物流通道与参数
收益
- • 规则可配置:运营/产品迭代不总改核心链路
- • 可观测:能解释为什么选了冷链/同城
- • 可回放:出问题能复盘当时规则
5)数据共享模式:过渡方案
它解决什么问题?
在微服务架构中,每个服务通常拥有自己的数据库(服务自治)。但有些场景下,多个服务需要访问同一份数据,比如:
- • 商品微服务需要读取商品信息
- • 库存微服务也需要读取商品信息(用于库存管理)
- • 如果各自独立存储,会导致数据孤立、跨服务数据访问繁琐、数据一致性难保障
数据共享模式的核心
通过共享数据库或数据代理层,让多个微服务访问同一个数据库,解决微服务独立存储下的数据共享问题。
电商里的典型场景
- • 商品微服务与库存微服务共享"商品数据库":两个服务都需要访问商品基础信息,共享数据库后可以直接查询,无需跨服务 API 调用
这样,商品服务和库存服务都能直接访问商品表,不需要通过 API 调用,减少了跨服务访问的复杂度。但需要注意:两个服务同时写商品表时,需要处理好事务和锁机制,避免数据不一致。
但这是过渡方案,不是目标
共享库虽然解决了数据访问问题,但带来了新的风险:
- • 并发与一致性问题:多个服务同时写同一张表,需要处理事务、锁机制
- • 表结构变更牵一发动全身:改一个字段,多个服务都要改、都要发版
- • 跨服务 join 成习惯:耦合被"固化",最终变成"分布式单体"
- • 服务边界模糊:谁负责维护这张表?出问题谁背锅?
退出路线(从共享库到服务自治)
- • 共享库(过渡期) → 按域拆库(目标)
- • 跨服务查询:用聚合层/CQRS 读模型解决
- • 跨服务一致性:用事件驱动 + 补偿(Saga 思路)解决
- • 数据同步:通过事件同步或数据复制,让每个服务拥有自己的数据副本
6)异步消息模式:事件驱动
在电商里,“支付成功”之后有大量不要求立刻返回给用户的事情:
- • 发短信、推送
- • 发放积分、优惠券核销
- • 触发发货、更新推荐、对账
这些都适合走 MQ/事件驱动:主链路更短、更稳;下游各自消费,互不影响。
但异步不是"上了 MQ 就完事"
工程上必须讲清楚四个关键词:
-
- 幂等:消息可能重复投递,消费必须可重复执行
-
- 可靠投递:避免"数据库写成功但消息没发出去"(事务消息/本地消息表)
-
- 失败处理:重试策略 + 死信队列 + 告警
-
- 可观测:traceId 贯穿生产/消费,能把链路串起来
六种模式的组合架构
如果用一句话总结电商微服务的常见组合:
- • 网关解决入口治理与流量
- • BFF/聚合解决多端与接口拼装
- • 同步链路承载必须立即反馈的核心流程(下单/支付),并用超时熔断保障稳定
- • 分支与编排承载变化快的业务规则(物流/风控/营销路径),让规则可配置、可追溯
- • MQ 事件驱动承载非核心链路(通知、积分、对账、异步履约),提升吞吐与解耦
- • 共享库解决跨服务数据访问问题(如商品服务与库存服务共享商品库),但需处理并发与一致性,并明确拆库路线,避免永久化
这套组合既对标"六种模式",又聚焦工程落地的边界与治理,不是简单的理论复述。
选型自检清单
当你面对一个业务需求时,按这几个问题快速定位用哪种组合:
-
- 用户是否必须立刻得到结果?
-
• 是 → 同步调用链
-
• 否 → 事件异步
-
- 页面是否需要聚合多个服务数据?多端差异大吗?
-
• 是 → BFF/聚合层
-
• 差异大 → 分 Web/App BFF
-
- 流程是不是规则多、变化快?
-
• 是 → 抽策略/规则/工作流,不要塞进核心服务
-
- 是否存在跨服务一致性?能否最终一致?
-
• 能 → 事件 + 补偿
-
• 不能 → 重新评估边界(强一致跨服务代价极高)
-
- 多个服务是否需要频繁访问同一份数据?能否接受共享库的并发与一致性风险?
-
• 是 → 可短期使用共享库,但需处理事务/锁,并明确拆库路线与时间表
总结
从软考的"六种微服务模式"到工程落地,核心不是记住概念,而是理解每种模式的适用场景和边界。真实项目中,这六种模式往往同时出现,需要根据业务特点灵活组合。
记住几个关键原则:
- • 同步用于核心链路,异步用于非核心链路
- • 聚合层要防膨胀,规则要可配置
- • 共享库只是过渡,需处理并发与一致性问题(事务、锁),并要有明确的退出路线
- • 事件驱动要保障,幂等、可靠投递、失败处理、可观测缺一不可
把这些原则应用到项目中,微服务架构才能真正落地,而不是"看起来很美"的分布式单体。