单体拆分的第一课:不是拆代码,是拆边界——DDD 限界上下文实战
引言 公司电商单体三年长到了 80 万行:一个 war 包里装着用户、订单、库存、支付、营销五个业务域,开发者 40 多人往同一个仓库里提交代码。CTO 终于拍板拆微服务,第一个专题会的议题却是让所有人都沉默的一问——"那我们怎么切? 研发 Leader 的直觉方案是按现有包结构切:com.shop.user 拆成用户服务、com.shop.order 拆成订单服务。看起来天经地义,但第一个反对声音来自订单组的资深开发:"订单里查用户收货地址是直接 join 用户表的,拆了服务这个 join 怎么办?"第二个反对来自库存组:"订单创建要锁库存、扣库存、释放库存,这是三个服务还是放订单里?" 这两个问题都不是代码问题,是边界问题。 单体时代用"共享数据库"偷偷掩盖了所有边界争议——join 一下就完事了,谁也不用想"收货地址到底属于用户域还是订单域"。拆分的第一课就是把这笔账算清楚:边界不清,拆出去的服务只是"分布式的单体",接口间的 join 变成 RPC 调用,性能更差、复杂度更高。 这篇文章用这个真实电商单体做案例,把"拆边界"的全过程走一遍:用 DDD 限界上下文识别业务边界 →....