架构演进
从最基础的分层架构到更先进和灵活的设计如端口和适配器(六边形架构),洋葱架构,以及整洁架构
分层架构
- 用户界面调用业务逻辑层,或者再调用数据访问
- 用户界面知道业务逻辑存在并且依赖它,逻辑也了解数据访问层。然而,数据层并不知道其他层的存在;
这是传统的 M级或分层架构
端口和适配器
在分层架构的基础上
- 反转逻辑和数据访问之间的依赖关系,并且需要逻辑层仍然能调用数据访问层
- 逻辑层无法感知数据层的实现细节
形成端口-适配的架构模式
六边形架构
在端口-适配的基础上
- 将外部驱动和内部依赖都抽象成端口-适配设计
- Primary/Driving: 外部驱动核心逻辑的适配器,比如:用户、web 控制器、测试代码、脚本、消息监听器、定时任务等
- Application Core:核心逻辑,无依赖(没有网络,也不涉及外部世界),让编写测试变得非常容易
- Secondary/Driven:被核心逻辑调用的外部依赖适配器,采用倒置驱动它们的核心;比如:数据库、消息队列、第三方接口、文件系统等。
洋葱架构
在六边形架构的基础上
- 把应用程序的核心划分为多层级,依赖关系始终指向内部
- 适配器形成一个外层,分为两个部分,区分主动适配器和从动适配器
补充说明:
- Domain 层一般按照领域驱动设计(DDD)的实践来构建
- Domain Service 可以包含跨越多个领域模型的逻辑以及数据抽象(基础设施层要实现的端口)
- App Services 遵循 CQRS 模式,业务流程编排
整洁架构
在六边形架构基础上
- 融合其他架构的概念,形成了一个可操作的单一理念
- 强化“用例层”概念
- 明确技术层属于最外围
- 术语与职责更细化
说明
-
Enterprise Business Rules(实体层)
- 定义系统永恒不变的业务核心
- 不依赖任何框架、技术或外部系统,只包含业务本质
-
Application Businese Rules(用例层)
- 定义系统具体的业务流程
- 组织并编排实体做事情,但不关心输入来源(Web/GUI)或输出去向(数据库/外部接口)
-
Interface Adapters(适配层)
- 桥梁,连接内外系统
- 适配外部接口到内部的用例调用(反之依然)
-
Frameworks & Drivers(最外层)
- 技术实现,最容易变化
- 技术实现细节层,如:数据库、Web 框架、第三方服务、前端页面等