业务架构如何指导微服务拆分?

从业务域到服务边界的推演------一个技术总监的十八年实战反思


文章概要

本文以个人亲身经历为切入点,探讨如何从业务架构出发指导微服务拆分。文章首先剖析了三种常见的拆分反模式------按数据库表、按技术层级、按团队人数,揭示这些做法如何导致分布式事务泛滥和性能下降。随后,提出了一条清晰的推导路径:业务域划分 → 限界上下文识别 → 聚合根提取 → 服务边界确定。以电商系统为例,完整演示了从业务架构全景图到微服务映射的推演过程。最后,明确了产品经理与技术架构师在拆分过程中的职责边界,并总结了四个常见陷阱及其应对策略。核心观点:好的架构不是设计出来的,而是从业务中生长出来的。

系列文章导读:

1. 企业级AI应用开发底座应该怎么设计

2. 为什么你的系统总是变成"屎山"?------业务架构缺失的代价

3. 如何画出一张真正能落地的业务架构图?------六要素实战指南

4. 业务架构如何指导微服务拆分?

5. 实战复盘:我如何从0到1画出一个复杂产品的业务架构

开篇

一次让我彻夜难眠的架构评审

2019年,我主导了一个物联网平台从单体架构向微服务架构的演进项目。那是我第一次完整经历"拆分"的全过程,也是让我至今想起来都会冒冷汗的一次经历。

当时的情况是这样的:平台跑了四年,代码库里堆了上百万行业务逻辑,十几个开发同学每天在同一个仓库里提交代码,合并冲突成了家常便饭。于是我们决定拆分微服务------按照数据库表,把系统切成了十几个服务:用户服务、设备服务、告警服务、数据分析服务、消息服务......

上线后问题接踵而至:一个"设备上线"的动作,要依次调用用户服务鉴权、设备服务更新状态、告警服务检查规则、消息服务推送通知。任何一个服务超时,整个链路就断了。最要命的是,为了保持数据一致性,我们引入了分布式事务,结果性能直接腰斩。

后来我们花了半年时间重新梳理业务架构,才发现问题的根源------我们是按照技术实现拆分的服务,而不是按照业务边界。用户鉴权和设备状态更新,本质上是同一个业务上下文里的操作,却被我们硬生生拆成了两个服务,中间隔着网络调用和分布式事务。

这件事让我深刻意识到:没有业务架构的微服务拆分,就是盲人摸象。

两种拆分路径的对比:技术实现驱动 vs 业务架构驱动

在这之后的几年里,我又经历了多次系统架构演进。从物联网平台的微服务架构,到无代码低代码平台的aPaaS架构。在这个过程中,我慢慢总结出一套从业务架构推导微服务拆分的方法。

今天这篇文章,我想把这些年踩过的坑和总结的经验写下来。不是为了给你一套"标准答案"------架构从来没有标准答案------而是希望提供一种思考方式,让你在面对拆分决策的时候,能有更清晰的判断依据。

01

为什么不能由技术架构直接拆分微服务?

在回答"应该怎么拆"之前,我想先聊聊"不应该怎么拆"。因为在我见过的案例里,错误的拆分方式远比正确的多。

三种典型的反模式

**第一种反模式:按数据库表拆分。**这是最常见的做法。系统里有一张用户表、一张订单表、一张商品表,于是自然就拆出了用户服务、订单服务、商品服务。听起来合理,但问题在于:数据库表的结构往往是历史遗留的,它可能混合了多个业务域的概念。更致命的是,一旦按表拆分,跨表查询就会变成跨服务调用,分布式事务就此埋下隐患。

**第二种反模式:按技术层级拆分。**有人会把系统按照Controller层、Service层、DAO层拆分成不同的服务,美其名曰"分层架构"。结果就是,一个"创建订单"的操作,需要跨越三层服务调用。这种拆分完全违背了"高内聚"的原则,把本该内聚的业务逻辑割裂得支离破碎。

第三种反模式:按团队人数拆分。"我们团队有五个人,那就拆五个服务吧。"这句话听起来荒诞,但确实在不少公司真实发生过。这种拆分的后果是:服务边界与组织架构绑定,而不是与业务边界对齐。一旦团队调整,服务就得跟着重构。

三种反模式的共同特征:拆分依据与业务边界无关

康威定律的误读

康威定律说"系统设计受限于组织沟通结构",很多人把它反过来理解:"所以让组织结构决定系统架构"。这是典型的因果倒置。正确的做法是:先设计好与业务对齐的架构,再根据架构调整组织。

02

从业务架构到微服务的推导路径

那么,正确的拆分路径应该是什么?我的答案可以归纳为一句话:

这条路径的核心在于:让技术架构成为业务架构的自然延伸,而不是另起炉灶。

推导路径的四个步骤

1. 业务域划分

这是业务架构的起点。根据业务的自然边界,把系统划分为若干个业务域。比如电商系统可以划分为交易域、营销域、仓储域、物流域、用户域。每个域有自己的核心业务对象和业务流程。

2. 限界上下文识别

在每个业务域内,识别出不同的"限界上下文"。限界上下文是DDD的核心概念,指的是一个业务概念在特定上下文中有明确、唯一的定义。比如"订单"在交易域是"购买合同",在仓储域是"拣货指令"------这是两个不同的限界上下文。

3. 聚合根提取

在每个限界上下文中,找出"聚合根"------也就是这个上下文的核心业务实体。聚合根是事务一致性的边界,也是数据操作的入口。比如交易域的聚合根是"交易订单",仓储域的聚合根是"拣货单"。

4. 服务边界确定

根据聚合根和限界上下文,确定微服务的边界。一个微服务通常对应一个限界上下文,包含一个或多个聚合根。服务之间的交互通过明确的接口(API或事件),而不是直接穿透对方的内部逻辑。

从业务域到微服务的四步推导路径

03

实战推演:电商业务如何拆分成微服务

光讲理论太抽象,我们来走一遍完整的推演过程。以电商系统为例,这是最典型的复杂业务场景,也是我这些年接触最多的领域之一。

第一步:画出业务架构图

首先,我们需要一张完整的业务架构图。这不是系统架构图,而是展示业务域划分和业务流转的地图。

电商系统业务架构全景图:五大业务域及其依赖关系

这张图展示的是业务视角的系统全貌。每个业务域都有自己的聚合根、核心流程和状态机。域与域之间通过业务接口交互,而不是直接穿透对方的内部逻辑。

第二步:识别限界上下文

在业务域的基础上,我们需要进一步识别限界上下文。限界上下文是DDD的核心概念,它解决的是一个根本问题:同一个词,在不同场景下有不同的含义。

以"订单"为例:

限界上下文 所属业务域 "订单"的含义 核心职责
交易上下文 交易域 购买合同 管理交易流程、资金核对
仓储上下文 仓储域 拣货指令 管理仓库拣配、库存扣减
物流上下文 物流域 发货通知 管理包裹运输、配送轨迹

这三个上下文里的"订单",虽然名字相同,但业务对象完全不同,核心职责也完全不同。这就是为什么必须在同一个限界上下文内保持一致性,而跨上下文则通过接口进行数据转换。

第三步:确定服务边界

有了限界上下文,服务边界就变得清晰了。一个服务通常对应一个限界上下文,包含该上下文内的所有聚合根、实体、值对象和领域服务。

微服务架构映射:每个服务对应一个限界上下文,拥有独立数据

第四步:映射到微服务

经过以上三步,我们已经得到了清晰的服务边界。最终的微服务架构如下:

微服务 对应业务域 聚合根 核心职责 独立数据库
order-service 交易域 交易订单 下单、支付、退款 trade_db
marketing-service 营销域 优惠券/活动 发放、领取、核销 marketing_db
inventory-service 仓储域 库存记录 入库、预占、扣减 wms_db
logistics-service 物流域 物流包裹 揽收、运输、签收 logistics_db
user-service 用户域 用户账户 注册、认证、管理 user_db

关键原则:数据独立

每个微服务必须拥有自己的数据库。服务A不能直接查询服务B的数据库,必须通过服务B提供的API或事件来获取数据。这是保证服务边界不被打破的最后一道防线。

04

产品经理/业务架构师的边界在哪里?

写到这里,我想专门聊聊一个很多人关心的问题:在微服务拆分的过程中,产品经理和业务架构师应该做什么?不应该做什么?

我在带团队的过程中发现,很多产品经理会不自觉地越界------试图去设计API接口、决定技术选型、规划数据库分片。而很多技术架构师也会反向越界------直接定义业务域、划定业务边界。这两种越界都会导致协作混乱。

05

常见陷阱与解决方案

在多年的架构演进实践中,我总结了四个最常见的陷阱。这些坑我都踩过,希望你不必再踩一遍。

陷阱一:边界模糊------服务变成"大单体"

**表现:**一个服务里塞了太多业务逻辑,订单服务里包含了库存管理、营销计算、物流调度。服务越来越大,最后又变成了分布式单体。

**解决方案:**回到业务架构图,重新审视业务域划分。如果一个服务承载了多个业务域的职责,说明限界上下文识别出了问题。重新识别上下文,拆分服务。

陷阱二:过度拆分------运维灾难

**表现:**一个系统拆成了三四十个服务,每个服务只有几十行代码。部署一次要启动几十个容器,排查一个问题要跨越十几个服务日志。

**解决方案:**先合后拆。对于业务尚不成熟的领域,先保持较大的服务边界,等业务稳定后再按需拆分。微服务的数量应该与业务复杂度匹配,而不是越多越好。

陷阱三:数据孤岛------一致性噩梦

**表现:**服务A的数据库里有用户数据,服务B的数据库里也有用户数据。两边数据不一致,导致业务逻辑出错。为了解决一致性问题,引入分布式事务,性能直线下降。

**解决方案:**定义清晰的业务事件流。服务A在用户数据变更时发布事件,服务B订阅事件并同步数据。采用最终一致性,而不是强一致性。只在绝对必要时使用分布式事务。

陷阱四:跨域穿透------边界被打破

**表现:**服务A直接读写服务B的数据库,或者服务A调用了服务B的内部实现方法(而非公开API)。服务边界形同虚设,系统复杂度失控。

**解决方案:**建立严格的边界约束。在架构评审时明确禁止跨域直连数据库。通过代码审查、架构守护工具(如ArchUnit)来保证边界不被打破。每个服务只能暴露API或事件,内部实现对其他服务完全隐藏。

06

总结:业务架构的终极价值

回顾这篇文章,我想传达的核心观点其实很简单:

**业务架构是技术架构的北极星。**没有业务架构的微服务拆分,就像没有地图的航海------你可能最终会到达某个地方,但大概率不是你真正想去的地方。

在我十八年的从业经历里,从铁路信息化到物联网平台,从单体架构到微服务架构,我越来越确信一件事:好的架构不是设计出来的,而是从业务中生长出来的。

业务架构的价值,不在于画出一张漂亮的图,而在于通过画这个图的过程,让团队对业务的理解达成一致。当产品经理、开发、测试都能看着同一张图,用同一套语言讨论同一个业务对象时,架构的难题就已经解决了一大半。

最后,送给所有在架构演进路上摸索的技术人一句话:不要为了拆分而拆分,不要为了技术而技术。让业务说话,让架构跟着业务走。

相关推荐
江米小枣tonylua2 小时前
译:设计生产级 RAG 架构
架构
怕浪猫8 小时前
领域特定语言(Domain-Specific Language, DSL)
设计模式·程序员·架构
怕浪猫8 小时前
哪些软件对 Chrome DevTools Protocol 频繁使用
人工智能·架构·前端框架
Jack2015 小时前
HarmonyOS APP事件驱动大揭秘
架构
米丘15 小时前
微前端之 Web Components 完全指南
微服务·html
秋播15 小时前
国内本地WSL2编译rancher源码
云原生
Colin草率地做慢慢地改15 小时前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构
candyTong1 天前
RTK 技术原理:一次典型会话里,80% 上下文是怎么省下来的
javascript·后端·架构
唐某人丶1 天前
从画架构图开始:架构分析与进阶指南
架构