一、引子聊架构总离不开“领域驱动架构”,大多能聊到DDD(Domain-Driven Design),实际上早期思想EBI架构 1992年就诞生了 。核心价值点在于:关注核心业务领域(高内聚),分离实现层(低耦合) 。后续一些演变架构有:端口和适配器架构、洋葱架构、整洁架构、事件驱动架构 。这一系列的架构演变 , 每个架构的核心思想了解下就好,不用纠结实现细节 。
二、架构演变2.1 EBI 架构(1992)EBI 架构(Entity-Boundary-Interactor,实体-边界-交互器)是Ivar Jacobson 在 1992 年就在他的著作 Object-Oriented Software Engineering: A use case driven approach中提出的 。附上2012年来北京讲座的照片 , 混个脸熟 。
文章插图
最早,Jacobson 把它叫做实体-接口-控制(Entity-Interface-Control),但是后来改成了 EBI,避免“接口”和编程语言中的结构“接口”混淆,以及“控制”和 MVC 中的“控制器”混淆 。如下图所示:
文章插图
这个图是不是很熟悉?没错,就是UML!Ivar Jacobson就是UML的三大创始人之一 。
核心:
- Entity实体:实体对象承载着相关业务领域的数据和操作 。对应着MVC的Model层 。
- Boundary边界:边界对象是对系统接口的建模 。所有依赖系统环境(工具和传达机制)的功能都属于边界对象 。对应着 MVC 中的 View 和 Controller 的整个展现层 。
- Interactor交互器:代表了展现层和实体之间的连接,也就是应用服务(编排用例)和领域服务(DDD概念) 。
- 通过职责的封装将系统的变化控制在局部(最好是一个对象) 。(单一职责原则)
文章插图
分层:
- 1.User Interface用户界面层:负责绘制和应用交互的屏幕界面并将输入翻译成应用的命令 。它们和EBI架构中的Boundary边界对象对应 。
- 2.Application应用服务层:协调领域对象完成用例 。它不包含业务逻辑 。应用层和EBI架构中的Interactor交互器相对应 , 只有一点不同,交互器是和界面或实体无关的任意对象,而这里应用层只包含和用例相关的对象 。
- 3.Domain领域层:这个层次包含了所有的业务逻辑,如领域服务、实体、事件和其他包含业务逻辑的任意对象类型 。它和 EBI 架构中的Entity实体对象类型对应 。
- 4.Infrastructure基础设施层:支持上述三个层次的技术能力,例如,持久化或者消息机制 。
领域模型准确反映了业务语言 , 而传统数据对象除了简单setter/getter方法外,没有任何业务方法,即失血模型 , 那么DDD领域模型就是充血模型(业务方法定义在实体对象中) 。
优点:
- 首次清晰描述了领域驱动的分层实现并统一了业务语言 。
- 单一职责、低耦合、高内聚、业务内核沉淀 。
让用户、程序、自动化测试和批处理脚本可以平等地驱动应用,让应用的开发和测试可以独立于其最终运行的设备和数据库 。——Alistair Cockburn 2005,端口和适配器 如下图所示:
文章插图
核心:
- 左侧: 代表 UI 的适配器被称为主适配器 , 它们发起了对应用的一些操作,端口(应用层API)和它的具体实现(controller实现)都在应用内部 。
- 右侧: 表示和后端工具链接的适配器,被称为从适配器,它们只会对主适配器的操作作出响应,端口在应用内部(业务接口),具体实现(impl)在应用之外 。
- 业务应用和实现(技术)隔离 。(面向接口编程)
- 方便测试 。(基于接口)
推荐阅读
- MySQL数据库的性能分析 ---图书《软件性能测试分析与调优实践之路》-手稿节选
- Git创建、diff代码、回退版本、撤回代码,学废了吗
- 【k8s连载系列】2. k8s整体架构
- rabbitmq docker安装消息队列及数据库(mongo、mysql)
- jk罗琳中文官网 jk罗琳
- Nginx的概述和配置
- Sqlite 安装操作使用
- 流金岁月各人物结局_流金岁月锁锁结局
- 五 RK3568开发笔记:在虚拟机上使用SDK编译制作uboot、kernel和ubuntu镜像
- Linux操作系统,笔录!