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

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


文章概要

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

系列文章导读:

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

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

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

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

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

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

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

相关推荐
苍煜1 小时前
Kubernetes 核心认知与集群架构(从Docker过渡到K8s)
docker·架构·kubernetes
倔强的石头1062 小时前
云原生环境下的存储弹性与自动化:表空间目录动态挂载与冷热分层实践
运维·云原生·自动化
修先生9 小时前
Kubernetes Dashboard 官方图形面板国内安装
云原生·容器·kubernetes
低调小一10 小时前
Midscene.js 原理拆解:它不是“自然语言点按钮”,而是一套会看屏幕的 UI 自动化运行时
人工智能·rnn·架构·大模型·transformer·tdd·midscene
苏渡苇10 小时前
万字长文 | Spring Cloud Alibaba组件之Nacos实战及Nacos客户端服务注册源码解析
spring cloud·微服务·nacos·注册中心·配置中心·sca
亚历克斯神10 小时前
Java 25 模式匹配增强:让代码更简洁优雅
java·spring·微服务
天天进步201510 小时前
魔音漫创源码解析:状态管理——复杂长链路下的状态同步:Zustand 在多面板协作中的应用
开发语言·架构
AI玫瑰助手13 小时前
Agent架构:规划、记忆、工具、反思
人工智能·架构·agent
hedian11613 小时前
2026短剧系统技术选型:H5私有化部署的技术架构与实践
架构