服务建模
一、服务建模的第一性原理
1.1 复杂性不可消除,只能被管理
软件系统的本质不是代码,而是对业务复杂性的承载与约束。
业务复杂性来源于:
- 多角色协作
- 状态变化
- 规则约束
- 不确定性
架构设计的目标不是"消灭复杂性",而是:
- **隔离复杂性**
- **限制复杂性传播**
👉 服务建模 = 对复杂性进行分区与封装的过程。
1.2 边界是复杂系统的核心
在复杂系统中,真正重要的不是模块内部,而是:
- 模块与模块之间的 **边界**
- 边界两侧的 **责任划分**
- 边界上的 **协作协议**
没有清晰边界的系统,复杂性会指数级增长。
👉 微服务的本质不是"服务很多",而是边界清晰。
1.3 架构必须允许演进
- 业务认知在初期一定是不完整的
- 早期的模型几乎必然是"错的"
因此:
好的服务建模不是一次性设计,而是允许被逐步修正的设计。
二、服务建模的认知分层(稳定度模型)
为避免"知识混杂",本文将服务建模拆分为四个稳定度层级:
服务建模认知层级├─ 第一性原理(最稳定)│ ├─ 复杂性管理│ ├─ 边界优先│├─ 架构哲学│ ├─ 低耦合 / 高内聚│ ├─ 演进式设计│├─ 架构模式│ ├─ Bounded Context│ ├─ 聚合(Aggregate)│ ├─ 六边形 / 整洁架构│ ├─ 绞杀者模式│└─ 工程策略(不稳定) ├─ Saga ├─ 事件溯源 ├─ 报表方案👉 阅读与实践时,应优先掌握上层,再选择下层策略。
三、什么是"好服务"
3.1 好服务的本质标准
松耦合
- 服务对外部世界的认知越少越好
- 只依赖稳定的契约,而非实现细节
高内聚
- 一个服务只解决**一类相关问题**
- 所有行为围绕同一业务目标展开
👉 高内聚 = 边界正确的结果,而非额外设计。
四、服务建模的三种视角(决策模型)
服务建模常见有三种切入方式,但它们的稳定性不同。
4.1 三种视角对比
| 视角 | 稳定性 | 适用阶段 | 风险 |
|---|---|---|---|
| 业务能力 | 高 | 全周期 | 低 |
| 用例 | 中 | 初期探索 | 中 |
| 技术能力 | 低 | 特定场景 | 高 |
4.2 核心结论
- **长期稳定架构应以业务能力为核心**
- 用例视角适合早期理解需求
- 技术能力不应主导服务边界
👉 技术应服务于业务边界,而非反之。
五、Bounded Context:服务建模的核心抽象
5.1 Bounded Context 的本质
Bounded Context(限界上下文)是:
- 一组**统一业务语义**
- 一套**一致的业务规则**
- 一个**概念不被外界污染的世界**
👉 BC 是认知边界,不是部署单元。
5.2 Bounded Context 与 Service 的关系
| 场景 | 说明 |
|---|---|
| 1 BC → 1 Service | 理想状态 |
| 1 BC → N Service | 演进或扩展阶段 |
| N BC → 1 Service | 早期或过渡阶段 |
👉 不要教条化"一对一"映射。
六、业务逻辑的组织方式
6.1 架构哲学:依赖反转
- 业务逻辑不依赖外部技术
- 外部通过适配器接入业务核心
这类架构包括:
- 六边形架构
- 整洁架构
👉 它们的本质都是:保护业务核心。
6.2 事务脚本 vs 领域模型
| 模式 | 适用场景 | 特点 |
|---|---|---|
| 事务脚本 | 简单业务 | 过程式、低成本 |
| 领域模型 | 复杂业务 | 状态+行为、可演进 |
👉 不要在简单系统中过度设计。
七、聚合:一致性的边界
7.1 聚合的目的
聚合不是为了建模"对象",而是为了:
- **限定一致性范围**
- **控制事务边界**
聚合根是:
- 唯一对外入口
- 一致性守护者
7.2 聚合设计的"张力"
- 聚合越小 → 扩展性越好 → 协调成本越高
- 聚合越大 → 开发成本低 → 扩展受限
👉 聚合设计永远是权衡问题。
八、领域事件:解耦的协议
8.1 领域事件的本质
领域事件表示:
领域中已经发生、且不可逆的事实
- 由聚合发布
- 被异步消费
👉 事件是跨边界协作的语言。
九、从单体到服务:演进式拆分
9.1 为什么不要过早拆分
- 早期业务理解不成熟
- 错误边界的代价极高
👉 先单体,后服务是理性选择。
9.2 绞杀者模式的哲学
- 新功能不再进入旧系统
- 单体自然萎缩
👉 演进优于革命。
十、服务拆分的多维决策模型
服务拆分维度├─ 业务维度│ ├─ 子域│ ├─ 业务能力│├─ 变化维度│ ├─ 变化频率│ ├─ 生命周期│├─ 非功能维度│ ├─ 性能│ ├─ 可靠性│ ├─ 安全│└─ 组织维度 ├─ 团队边界 ├─ 责任归属👉 单一维度无法得出合理拆分结论。
十一、数据、一致性与事务
11.1 核心原则
- 避免跨服务事务
- 接受最终一致性
11.2 可选策略(非必选)
- Saga
- 重试
- 补偿
👉 架构设计的最高境界是避免问题,而非解决问题。
十二、组织与架构的协同
12.1 Conway 定律视角
- 架构是组织结构的映射
- 服务边界 ≈ 团队边界
12.2 责任模型
- 一个服务 = 一个责任主体
- 聚合根 = 决策中心
👉 技术架构本质上是社会系统设计。
十三、总结
- 服务建模不是技术问题,而是认知问题
- 好的架构来自对边界的尊重
- 演进能力比"完美设计"更重要
关联内容(自动生成)
- [/软件工程/微服务/微服务.html](/软件工程/微服务/微服务.html) 微服务概述文档涵盖了微服务架构的核心概念、挑战和前置条件,与服务建模密切相关
- [/软件工程/微服务/集成.html](/软件工程/微服务/集成.html) 服务集成是服务建模后的重要环节,涉及服务间通信、跨服务业务流程等关键内容
- [/软件工程/领域驱动设计.html](/软件工程/领域驱动设计.html) 领域驱动设计是服务建模的重要理论基础,其中的限界上下文、聚合等概念直接影响服务边界划分
- [/软件工程/架构/系统设计/业务建模.html](/软件工程/架构/系统设计/业务建模.html) 业务建模是服务建模的前提,提供了业务领域的分析和建模方法
- [/软件工程/架构/系统设计/架构设计.html](/软件工程/架构/系统设计/架构设计.html) 架构设计提供了服务建模的整体框架和设计原则,是服务建模的上层指导
- [/软件工程/架构模式/分层架构.html](/软件工程/架构模式/分层架构.html) 分层架构是服务内部组织结构的重要模式,与服务建模中的内部结构设计相关
- [/软件工程/架构/系统设计/分布式/分布式系统.html](/软件工程/架构/系统设计/分布式/分布式系统.html) 微服务本质上是分布式系统,分布式系统的设计原则和挑战对服务建模有重要影响
- [/软件工程/架构/架构.html](/软件工程/架构/架构.html) 架构的基本概念和原理为服务建模提供了理论基础
- [/软件工程/架构/系统设计/可观测性.html](/软件工程/架构/系统设计/可观测性.html) 服务建模需考虑可观测性设计,确保拆分后的服务可监控、可追踪
- [/软件工程/架构/系统设计/网关.html](/软件工程/架构/系统设计/网关.html) 网关是微服务架构中的重要组件,与服务建模中的边界和服务交互设计相关
- [/软件工程/架构/演进式架构.html](/软件工程/架构/演进式架构.html) 演进式架构理念与服务建模的演进性原则高度契合
- [/软件工程/架构/架构治理.html](/软件工程/架构/架构治理.html) 服务建模后的治理和维护是确保架构持续有效的关键
- [/软件工程/设计模式/设计模式.html](/软件工程/设计模式/设计模式.html) 设计模式在服务内部实现中发挥重要作用,是服务建模后实现阶段的重要参考
- [/数据技术/数据架构.html](/数据技术/数据架构.html) 服务建模需考虑数据分布和一致性策略,与数据架构设计密切相关