跳转到内容

分层架构演进

用途:理解各种分层风格从何而来、各自解决什么问题

阶段 形态 解决的问题 遗留问题
1 单体一段式脚本 快速实现 无结构,规模一大即失控
2 三层(表现/业务/数据) 代码归类、职责初分 依赖方向可反向渗透,业务层依赖 SQL 细节
3 四层(+ 领域层) 业务规则集中、可测试 仍可能出现领域层依赖基础设施
4 依赖倒置(端口在内部) 领域层不依赖技术细节 端口/适配器概念未显式化
5 六边形 / 洋葱 / 整洁架构 显式化“核心与外围”,适配器可替换 小系统过度设计的风险
6 组件化与模块化单体 在单进程内固化模块边界 需要构建期约束支撑
7 微服务 独立部署与团队自治 分布式复杂度、数据一致性

依赖指向稳定的一侧:业务规则最稳定,技术细节最易变,因此代码依赖必须从技术细节指向业务规则,而不是相反。Robert C. Martin 的依赖规则(源码依赖只能朝内)是同一件事的不同表述。

层数的意义只在一个地方:让“改哪里不影响哪里”成为可验证的事实。如果加了层却没有约束依赖方向,分层只是目录结构。

反过来,如果模块本身极简(配置管理、字典维护),三层以内完全合理——按子域价值分级投入。

分层是代码结构问题,微服务是部署与组织问题,两者正交:单体可以有漂亮的分层,微服务也可能每层都混乱。先解决结构,再决定部署粒度,是更稳的顺序。

误区 修正
层数越多越架构 以“隔离变化的能力”衡量,不以层数衡量
只有目录分层没有依赖约束 引入架构测试,违反即在 CI 失败
每一层都要建一套模型 只在跨边界处转换(对外协议、持久化结构、领域模型)
把 ORM 实体当领域模型 至少保证持久化对象不进入应用与接口层
简单模块强行套四层 按复杂度分级,允许事务脚本风格
  • Robert C. Martin《Clean Architecture》(依赖规则)
  • Alistair Cockburn 关于 Hexagonal Architecture 的原始文章
  • Eric Evans《领域驱动设计》第 13 章(分层架构与其局限)
  • Vaughn Vernon《实现领域驱动设计》第 11 章(架构与基础设施关注点)