电商后台系统做微服务改造,第一步不是选框架,也不是搭注册中心,而是先把“边界”想清楚。我过去几年都在跟电商供应链和营销结算这两条线打交道,也就是常说的SPS(供应商服务系统)和CPS(按成交计费的推广结算系统),看着它们从单体Java应用一步步拆成十几个微服务,中间踩了很多坑,也总结了不少能直接落地的经验。今天就把微服务拆分过程中关于边界界定和实操技巧的部分沉淀下来,希望能帮到正在做同类改造的团队。
先说一个核心观点:微服务拆分的难点从来不在技术,而在业务边界怎么画。 画错了,后面所有的分布式事务、接口调用、数据一致性都会变成噩梦,而且越到后期越难纠正。所以这篇文章的重点会放在“怎么识别边界”和“怎么落地拆分”这两件事上,结合SPS和CPS系统的具体业务场景来拆解,顺带聊一聊拆分过程中那些文档里不会写的坑。
1. 先从业务看:SPS/CPS到底在解决什么问题
很多团队一上来就画系统架构图、定微服务清单,结果拆出来的服务跟业务是脱节的。原因很简单:没有先把业务吃透。在讨论边界之前,得先弄清楚SPS和CPS这两套系统各自的业务本质。
1.1 SPS系统的核心痛点
SPS在电商体系里一般指供应商服务系统,解决的是“货怎么进来、怎么变成可售商品、怎么跟平台同步库存价格”的问题。单体阶段这个系统通常包揽了供应商入驻、资质审核、商品资料维护、价格库存同步、采购订单管理一大堆职责。
这里有个很容易被忽略的特点:SPS系统其实是一个典型的流程管理系统,状态机特别复杂。一个供应商从申请入驻到正式供货,中间要经历资料提交、资质审核、合同签署、商品上架、供货状态变更等多个阶段。每个阶段涉及不同角色、不同数据表、不同的审批规则,而且这些流程彼此还有依赖关系。
单体应用下这种复杂度还能靠事务硬扛,但问题在于:SPS系统的一部分功能跟主站的商品中心、订单中心耦合在一起,比如供应商改了个价格,要同步到商品中心生效;采购单审核通过之后,要驱动后面的供货单创建。这些跨系统的调用在单体里是直接方法调用,拆开之后就变成了服务间通信问题,边界一旦划错,轻则同步延迟,重则数据错乱。
1.2 CPS系统的核心痛点
CPS系统解决的是“怎么把货卖出去、怎么分钱”的问题。它的业务链路是:平台招募推广渠道(达人、站长、导购平台),推广渠道通过专属链接或二维码引导用户下单,订单成交后系统根据归因规则判定这个订单归属于哪个渠道,然后计算佣金、发起结算。
CPS系统有两个鲜明的业务特征,直接决定了它的拆分方式和SPS完全不一样:
一是数据量有明显的峰值特征。大促期间订单量可能是平时的几十倍,而每一笔订单都要经过归因判断、佣金计算、数据回写这几个步骤。如果佣金计算和订单主流程耦合在一起,大促时要么把订单链路拖垮,要么把结算链路拖垮,很难两全。
二是资金敏感度极高。佣金算错一分钱,渠道那边就会来投诉,而且涉及真金白银,是没法用“最终一致性”四个字蒙混过关的。这意味着CPS系统里的资金账户、佣金明细、结算单这些模块,要有比对账、比审计更严格的数据保障机制。
1.3 单体阶段积攒的“债务”
回到真实场景,绝大多数需要拆分的SPS/CPS系统,都是经历了几年迭代的“大泥球”:
- 一个订单服务里面塞了佣金计算逻辑,一个商品服务里面塞了供应商价格同步逻辑;
- 公用一个数据库,一个表几百个字段,一半字段只有某个业务在写,其他都是“历史遗留”;
- 新人接手根本不敢动代码,因为改一个方法可能影响好几条业务线;
- 发布一次要全量回归,动辄几个小时,上线窗口只能安排在凌晨。
这些问题表面上是技术债,本质上全是边界混乱造成的。所以拆分的起点不是写代码,而是把“每块业务到底归谁管”这件事掰扯清楚。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 边界界定的方法论:别从技术出发,从业务找边界
很多团队拆微服务最喜欢按“层”来拆,比如拆出一个“接口层服务”、拆出一个“数据层服务”,或者按技术组件来拆,比如拆出“Redis服务”、“MQ消费服务”。这些都是典型的错误示范,拆出来的服务没有任何业务含义,只会让系统更碎、更难维护。
正确做法是从业务能力出发,找到那些“内部高内聚、彼此低耦合”的领域边界。
2.1 用限界上下文框定服务范围
落地方法上,DDD(领域驱动设计)里的“限界上下文”是我用过最好用的工具,但别把它想得太玄。限界上下文翻译成大白话就是:同一个业务概念,在不同场景下有不同的含义和规则,把这些不同含义和规则分开,就是限界上下文。
举个SPS系统里的经典例子。“商品”这个概念,在供应商眼里和在平台运营眼里完全是两回事。
供应商在SPS系统里维护的“商品”,本质是“供货商品”,关心的是成本价、供货状态、起订量;平台商品中心里的“商品”,本质是“销售商品”,关心的是售价、上下架状态、类目属性。单体系统里这两个概念经常混在一张表里,拆服务的时候就必须把它们拆开:SPS服务只维护“供货商品”,通过数据
