微服务拆分套路拆解:BFF 服务于前端的法则与六大拆分原则,以电商为例
拆分微服务,先搞懂这七条法则 BFF 不是新概念,但翻车率极高 当你决定从单体拆微服务,问得最多的问题往往是:“前端到底该调哪个服务?” 见过太多次这种场景——前端对着十几个 API 接口陷入选择困难症:一个商品详情页要调 5 个服务才能拼完整,首页要调 8 个。于是前端自己写了个"聚合层",但没有服务端治理能力,比单体时代还乱。 BFF(Backend For Frontend,为前端服务的后端) 就是来解决这个的。它不是简单在前面加个代理,而是有明确的拆分法则。 BFF 拆分三法则 按客户端维度切分 不同端消费场景天然不同: 移动端 BFF:接口瘦、响应快、流量敏感,需要数据压缩和裁剪 Web 端 BFF:数据全、可交互多,可能需要 SSE 之类推送能力 小程序/第三方 BFF:安全校验严密,接口格式受平台约束 某团队早期把移动和 Web 共用一个 BFF,结果移动端要的"轻量接口"和 Web 端要的"完整数据"打架,BFF 越写越臃肿,成了一个"新型大单体"。 核心法则:一个端一个 BFF 实例。 代码可以复用,但部署实例要独立,避免互相影响。 BFF 只做编排,不做业务 BFF 层最容易踩的坑是"顺手把业务逻辑也写了"。 它的职责边界非常清晰: 该做的:接口聚合、数据裁剪、字段格式化、请求路由、Token 校验 不该做的:优惠计算、库存扣减、订单校验、风控规则 BFF 是服务员,不是厨师。厨师在后厨(业务服务),服务员只负责拼盘上菜。 关注点分离——BFF 不做跨服务事务 BFF 同时调了订单服务和库存服务,发现库存扣减成功但订单创建失败——这时候 BFF 能回滚吗?不能。BFF 层没有分布式事务能力。 碰到需要事务强一致的场景,BFF 必须把这个"烫手山芋"扔给下游的编排服务(比如用 Saga 模式),别自己在 BFF 层 try-catch 补偿。 flowchart LR subgraph Client["📱 客户端层"] WEB(["Web App"]) APP(["移动 App"]) MINI(["小程序"]) end subgraph BFF["🔀 BFF 层"] WB[Web BFF\n内容聚合+认证] MB[Mobile BFF\n数据裁剪+压缩] XB[三方 BFF\n签名校验+格式转换] end subgraph Biz["⚙️ 业务服务层"] BS[商品服务] CS[购物车服务] OS[订单服务] US[用户服务] PS[支付服务] end subgraph Store["💾 数据层"] DB[(MySQL)] CACHE[(Redis)] ES[(Elasticsearch)] end WEB -->|HTTP| WB APP -->|HTTP| MB MINI -->|HTTP| XB WB -->|RPC| BS & CS & OS & US & PS MB -->|RPC| BS & CS & US XB -->|RPC| OS & PS BS & CS & OS & US & PS --> Store classDef startEnd fill:#701a4c,stroke:#e11d48,stroke-width:2.5px,color:#fce7f3,font-weight:bold; classDef process fill:#1e1e24,stroke:#6b7280,stroke-width:2px,color:#e5e7eb; classDef data fill:#052e16,stroke:#16a34a,stroke-width:2px,color:#bbf7d0,font-weight:bold; classDef bff fill:#0f172a,stroke:#3b82f6,stroke-width:2.5px,color:#bfdbfe,font-weight:bold; class WEB,APP,MINI startEnd; class WB,MB,XB bff; class BS,CS,OS,US,PS process; class DB,CACHE,ES data; 业务能力拆分——最直觉的切法 最简单的拆分方式:按业务功能划分。电商天然就能分成商品、订单、用户、支付、库存这些模块。每个服务对应一个业务域,内部有独立数据库,对外暴露接口。 ...

