3. 业务领域建模:如何识别核心域、支撑域和通用域
在微服务架构设计中,服务边界的合理性直接决定了系统的演进成本与运行效率。业务领域建模是回答“该拆成多少个服务”这一问题的核心方法。本章将围绕领域驱动设计(DDD)中的战略设计,系统讲解如何通过事件风暴(Event Storming)识别业务事件,并最终映射出服务候选。
3.1 领域划分:核心域、支撑域与通用域
DDD 战略设计将业务领域划分为三个层次,其核心思想是资源聚焦:将最优质的研发资源投入到最具竞争力的业务上。
| 领域类型 | 定义 | 典型特征 | 微服务策略 |
|---|---|---|---|
| 核心域 | 企业最核心、最具差异化的竞争力所在 | 业务逻辑复杂、变化频繁、不可外包 | 独立团队、高投入、定制化开发 |
| 支撑域 | 为核心域提供必要支持,但非核心竞争力 | 业务逻辑中等、可部分复用 | 内部自研或少量定制 |
| 通用域 | 行业通用、无业务差异化的能力 | 逻辑标准、变化极少 | 优先采购或使用开源方案 |
实践建议:在项目启动阶段,使用“业务价值矩阵”对每个子域进行打分(价值维度:业务贡献度、创新度;复杂度维度:逻辑耦合度、变更频率)。得分最高的子域即为核心域候选。
以电商系统为例:订单履约(涉及库存锁定、支付路由、物流调度)通常是核心域;商品管理(SKU 维护、类目树)可能是支撑域;用户认证(登录、注册、权限)则是典型的通用域,可直接集成 Keycloak 或 Auth0。
3.2 使用事件风暴(Event Storming)进行业务梳理
事件风暴是一种协作式建模工作坊,由 Alberto Brandolini 提出。它通过“业务事件”作为统一语言,让产品、开发、测试、运营等角色在同一张白板上对齐认知。
3.2.1 事件风暴的四种核心元素
| 元素 | 颜色(标准) | 含义 | 示例 |
|---|---|---|---|
| 领域事件 | 橙色 | 业务中已经发生的、不可改变的事实 | “订单已支付” |
| 命令 | 蓝色 | 触发事件的用户操作或系统指令 | “提交支付请求” |
| 聚合 | 黄色 | 承载业务逻辑的数据与行为单元 | “订单聚合” |
| 外部系统/角色 | 粉色 | 事件发起者或接收者 | “支付网关”、“买家” |
3.2.2 事件风暴的典型流程
- 时间线发散:从“用户注册”到“订单完成”,全员贴出所有橙色领域事件,不讨论细节。
- 命令回溯:对每个事件,追问“是什么命令导致了这件事?”,贴上蓝色命令。
- 聚合识别:将命令与事件之间的业务逻辑封装为黄色聚合。
- 边界划分:根据聚合的关联度与变更频率,画出有界上下文(Bounded Context)边界。
关键产出:事件风暴结束后,团队应得到一张包含“事件-命令-聚合”的完整时间线图,以及初步的有界上下文划分草图。
3.3 从业务事件到服务候选的映射
事件风暴产出的有界上下文,天然对应微服务候选。但并非每个有界上下文都需要独立部署为一个微服务。我们需要通过以下规则进行收敛与决策:
3.3.1 映射规则
| 判断维度 | 独立服务 | 合并服务 |
|---|---|---|
| 变更频率 | 两个上下文变更节奏不同 | 变更节奏高度一致 |
| 数据独立性 | 需要独立数据库或缓存 | 共享同一数据源且无冲突 |
| 团队结构 | 由不同团队维护 | 同一团队维护且规模小 |
| 调用模式 | 同步调用延迟敏感或异步解耦 | 内部方法调用即可满足 |
3.3.2 映射示例:订单履约流程
以下 SVG 展示了从事件风暴到服务候选的映射过程:
3.4 实战案例:电商订单履约的领域建模
假设我们正在设计一个电商平台的订单履约系统。通过事件风暴工作坊,团队识别出以下关键元素:
3.4.1 事件风暴产出
| 领域事件 | 触发命令 | 所属聚合 | 有界上下文 |
|---|---|---|---|
| 订单已创建 | 提交订单 | 订单聚合 | 订单上下文 |
| 库存已锁定 | 锁定库存 | 库存聚合 | 库存上下文 |
| 支付已成功 | 确认支付 | 支付聚合 | 支付上下文 |
| 物流单已生成 | 创建运单 | 物流聚合 | 物流上下文 |
| 订单已发货 | 确认发货 | 订单聚合 | 订单上下文 |
3.4.2 服务候选决策
根据映射规则,我们做出以下决策:
- order-service(核心域):独立部署,负责订单状态机、订单生命周期管理。
- inventory-service(支撑域):独立部署,但通过异步消息与 order-service 交互。
- payment-service(通用域):对接第三方支付网关,可考虑 SaaS 方案。
- shipping-service(支撑域):对接多家物流公司,内部自研。
常见误区:不要将“有界上下文”直接等同于“微服务”。如果两个上下文变更频率相同、数据强一致、且由同一团队维护,合并为一个服务可以降低运维复杂度。微服务的粒度应随团队规模和业务复杂度动态调整。
3.5 本章小结
业务领域建模是微服务架构设计的起点。通过领域划分(核心域/支撑域/通用域)明确资源投入优先级,借助事件风暴建立统一语言并识别聚合边界,最后根据变更频率、数据独立性、团队结构等维度将有界上下文映射为服务候选。这套方法能够有效避免“一刀切”或“过度拆分”的架构陷阱。