2Building Microservices(第2版)

拆分策略

如何拆分服务

限界上下文领域驱动设计拆分粒度数据所有权

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第2章:拆分策略(Splitting Strategies)

一、导读

1.1 本章学习目标

第2章讲解如何将系统拆分为微服务。这是微服务架构中最困难也最重要的决策。

1.2 为什么第二章如此重要

拆分粒度直接决定了微服务架构的成败。拆得太粗,失去了微服务的优势;拆得太细,运维成本难以承受。

1.3 核心问题引导

如何确定服务边界?

限界上下文是什么?

数据所有权如何划分?

拆分粒度如何把握?


二、核心概念详解

2.1 限界上下文

限界上下文(Bounded Context)来自领域驱动设计(DDD),是确定服务边界的核心工具。

电商系统的限界上下文:
- 商品目录(Catalog):管理商品信息
- 库存(Inventory):管理库存数量
- 订单(Order):管理订单生命周期
- 支付(Payment):处理支付
- 物流(Shipping):管理配送
- 用户(User):管理用户信息

2.2 拆分策略

2.2.1 按业务能力拆分

按照业务能力(business capability)来拆分服务:

零售业务能力图:
├── 商品管理
│   ├── 目录管理 → 商品服务
│   └── 库存管理 → 库存服务
├── 订单管理
│   ├── 下单 → 订单服务
│   └── 退款 → 退款服务
└── 支付管理
    └── 支付处理 → 支付服务

2.2.2 按子域拆分

按照子域(subdomain)来拆分:

核心域:订单管理、商品管理
支撑域:用户管理、库存管理
通用域:通知、日志

2.3 数据所有权

每个服务拥有自己的数据存储:

反模式:共享数据库
- 多个服务访问同一个数据库
- 服务之间通过数据库耦合

正确做法:数据库 per 服务
- 每个服务有自己的数据库
- 服务之间通过 API 通信

2.4 拆分粒度

太粗(反模式):
- 一个服务包含所有业务逻辑
- 本质上是分布式单体

太细(反模式):
- 每个实体一个服务
- 运维成本过高

合适:
- 一个限界上下文一个服务
- 一个团队能维护的规模

三、实战案例

3.1 电商系统拆分

拆分前(单体):
- 一个应用,一个数据库
- 10 个模块,50 张表

拆分后(微服务):
- 商品服务:商品 CRUD、搜索
- 库存服务:库存管理、预留
- 订单服务:下单、状态管理
- 支付服务:支付处理、退款
- 用户服务:注册、登录、权限
- 通知服务:邮件、短信、推送

四、本章小结

服务拆分是微服务架构的核心决策。使用限界上下文确定边界,按业务能力或子域拆分,每个服务拥有自己的数据,拆分粒度要适中。


五、思考与练习

如何识别限界上下文?

拆分粒度如何权衡?

如何处理跨服务的数据一致性?

共享数据库有什么问题?

如何从单体逐步拆分?


2/8拆分策略
0%