分布式系统本质与挑战 与 CAP、BASE 与一致性模型 讲了分布式问题与数据取舍;本章回答:要不要拆、拆成什么形态。盲目 微服务 会把 CAP、BASE 与一致性模型 中的 CAP、部分失败 成本成倍放大。
分层单体(Layered Monolith):按技术层划分包结构,所有业务能力共享同一部署单元与数据库。优点是上手快、本地调试简单、事务在进程内完成;风险是边界模糊时演变成「大泥球」——改订单逻辑可能误触库存表。
flowchart TB UI[Web / API Controller] --> APP[Application Service] APP --> DOM[Domain Model] DOM --> INF[Infrastructure / JPA] INF --> DB[(单一数据库)]
所有业务共享一个 DB 与一次发布;适合团队小、领域尚在高速试错阶段。
仍在一个进程、一次部署,但按业务能力或限界上下文划分子模块(Maven/Gradle 多模块),模块间通过显式 API 通信,禁止随意跨模块访问对方表。
shopflow-order、shopflow-inventory、shopflow-payment 模块,共享 shopflow-app 启动器。// 反例:订单服务直接操作库存表
@Service
class OrderService {
@Autowired InventoryRepository inventoryRepo; // 跨上下文泄漏
void placeOrder(...) {
inventoryRepo.decrement(skuId, qty);
}
}
// 推荐:通过 inventory 模块公开门面
@Service
class OrderService {
private final InventoryFacade inventory;
void placeOrder(...) {
inventory.reserve(new ReserveCommand(orderId, skuId, qty));
}
}
2000 年代前后,面向服务架构(SOA) 强调将企业能力封装为可复用服务,常配合企业服务总线(ESB) 做路由、转换、编排与集中治理。
timeline title 从集中到分布式的常见路径 2000s : 分层单体 / 大泥球 2005-2015 : SOA + ESB 集中编排 2014+ : 微服务 + 轻量消息总线 / API 网关 近年 : 模块化单体复兴 + 选择性微服务
不是「微服务取代一切」,而是按组织成熟度在谱系上移动。
flowchart LR O[订单系统] --> ESB[ESB 总线] I[库存系统] --> ESB P[支付系统] --> ESB ESB --> T[转换 / 路由 / 编排规则]
所有集成逻辑汇聚到总线:强大但易成瓶颈与「分布式大泥球」的控制中心。
微服务不是「更先进的单体」,而是用运维与组织复杂度交换独立演进能力。下表帮助你在评审会上说清利弊。
| 维度 | 收益 | 成本 / 风险 |
|---|---|---|
| 交付 | 团队按服务独立发布,减少「全站回归 2 周」 | 集成测试、契约测试、环境矩阵变多 |
| 技术 | 可按服务选型(如搜索用 Elasticsearch) | 统一可观测、安全基线、依赖治理难度上升 |
| 弹性 | 故障隔离(inventory 挂了不必拖垮整站) | 分布式事务、Saga、幂等、链路追踪必须到位 |
| 组织 | 与 康威定律 对齐,责任清晰 | 需要平台工程、SRE、API 治理投入 |
| 信号 | 更倾向 | 说明 |
|---|---|---|
| 团队 < 10 人,领域边界每周变 | 模块化单体 | 先固化边界,再付分布式税 |
| 3+ 团队并行,发布互相阻塞 | 微服务(边界已清) | 独立部署回报大于集成成本 |
| 强一致跨库事务是常态 | 暂缓拆分或保留单体事务 | 拆后须 Saga / 2PC,复杂度高 |
| 读多写少、可接受最终一致 | 微服务 + 事件 | 与 CAP、BASE 与一致性模型 AP 路径一致 |
当 Order / Inventory / Payment 由不同小队维护、且库存接口变更每周阻塞订单发布时,拆成三个可部署服务才有明显回报;否则模块化单体 + 清晰模块 API 往往足够。
康威定律(Conway's Law):设计系统的组织,其产生的设计等价于组织内的沟通结构。换言之一一你的架构图最终会像你的组织架构图。
payment-service 作为独立部署单元更自然。flowchart TB
subgraph teamOrder [订单小队]
OS[order-service]
end
subgraph teamInv [库存小队]
IS[inventory-service]
end
subgraph teamPay [支付小队]
PS[payment-service]
end
subgraph platform [平台小队]
GW[API Gateway]
REG[注册中心]
end
GW --> OS
GW --> IS
OS -->|同步 reserve| IS
PS -->|PaymentCompleted 事件| OS
服务边界与「能独立决策、独立发布」的团队边界尽量同构;跨团队集成走稳定契约。
两个团队仍共用一个 backlog,却维护六个微服务 — 变更仍需全员协调,却背上分布式排障成本。这叫分布式单体(领域建模、边界上下文与 API 契约 会进一步约束边界)。
下列信号出现越多,越应推迟物理拆分,优先模块化单体或合并服务。
Order 与 Inventory 实体互相引用,无法一句话说清谁拥有哪张表。通常否:优先模块化单体 + 清晰门面;当发布阻塞或团队分组成熟后再拆。拆早会把 CAP、BASE 与一致性模型 中的 CAP、部分失败成本全部兑现且无人力消化。
下一章进入 领域建模、边界上下文与 API 契约,把「模块/服务边界」落到限界上下文与 OpenAPI。
每条对应上一节 h3,用于架构评审前的 30 秒复述。
过关清单(勾选会保存在本浏览器)
0 / 5 已勾选
| 概念 | 一句 |
|---|---|
| 模块化单体 | 单部署,模块间只走公开 API |
| ESB | 集中编排,易成瓶颈 |
| 微服务 | 独立部署 + 自有数据 + 组织对齐 |
| 康威定律 | 架构镜像沟通结构 |
| 不宜拆 | 边界糊、无自动化、团队过小 |
下一步:勾选过关清单、完成测验与 Demo;下一章 领域建模、边界上下文与 API 契约 固化限界上下文与 API 契约。
用「架构形态决策表」与康威定律,为 ShopFlow(7 人 / 日单 200)写架构选型备忘。
「为用上 K8s,先把 Order 拆成 5 个微服务,团队仍是一个 7 人全栈小队。」违反哪 2 条原则?更稳妥的第一步?
违反康威定律(组织未拆、服务先拆)与不宜硬拆信号(边界/自动化不足)。第一步:模块化单体 + ArchUnit 约束。
哪条更像 SOA+ESB 反模式?① Gateway 只路由鉴权 ② 所有 JSON↔XML 转换集中在 ESB ③ 各服务维护 OpenAPI
答:②。ESB 成为转换与编排瓶颈,变更需总线团队审批;①③ 符合智能端点 + 契约分散维护。
目录:demos/basics-03-architecture-styles-lab/。验收:团队拓扑表三行与决策表「约束」列已填完。