首页 > 其他分享 >DDD架构为什么应该首选六边形架构?

DDD架构为什么应该首选六边形架构?

时间:2023-07-21 14:55:56浏览次数:41  
标签:依赖 资源库 分层 架构 整洁 六边形 DDD

一、传统分层架构

分层架构的一个重要原则是:每层只能与位于其下方的层发生耦合。

分层架构分两种:一种是严格分层架构,规定某层只能与直接位于其下方的层发生耦合;另一种是松散分层架构,允许任意上方层与任意下方层发生耦合。

下图是一个典型的DDD传统分层架构。

以上分层架构中各层都有自己的职责:

用户接口层负责处理用户请求和用户显示;

应用层实现不同业务场景下的用例或业务流程。其中应用服务通常接收来自用户接口层的请求,然后通过资源库获取聚合实例,最后执行相应的命令操作,如下示例:

// 应用层的用例 
public void cancelOrder(Long orderId) { 
    Order order = orderRepository.findById(orderId); 
    // 领域层的业务逻辑 
    order.cancel() 
    orderRepository.save(order); 
}

领域层实现系统的核心业务逻辑,主要包含基于DDD业务建模产生的领域模型,这里的业务逻辑不同于应用层中的业务流程,如上代码示例;

基础设施层为其它各层提供通用的技术和基础服务,比如数据持久化功能。

二、传统分层架构的问题

DDD中资源库(Repository)用来获取或持久化聚合,每个聚合都拥有一个对应的资源库。由此可见资源库应该和聚合位于同一层,资源库接口定义应该位于领域层,而资源库接口实现需要依赖基础设施层的持久化机制,此时资源库接口实现放在哪一层对传统分层架构来说是个问题。

如果把资源库接口实现放在基础设施层,那么基础设施层就会向上依赖领域层,这样就违反了分层架构的原则:每层只能与位于其下方的层发生耦合。

或者可以放在领域层,但是这样会使领域层依赖数据持久化的实现细节,导致领域层不再是一个稳定层。

也可以放在应用层,不过和放在领域层会有同样的问题。

那有没有更好的方式呢?

有,采用依赖倒置,打破分层架构原则。

三、依赖倒置原则

依赖倒置(或依赖反转)原则(Dependency inversion principle,DIP),由Bob大叔提出,其定义如下:

高层模块不应该依赖于低层模块,两者都应该依赖于抽象。 抽象不应该依赖于细节,细节应该依赖于抽象。

我们把资源库接口实现放在基础设施层,让基础设施层向上依赖领域层。虽然这样违背了分层架构原则,但是却符合依赖倒置原则:领域层(高层模块)不依赖基础设施层(低层模块),两者都依赖于资源库接口(抽象)。采用了依赖倒置后,同时调整下基础设施层位置,此时分层架构如下图:

四、六边形架构

分层架构采用依赖倒置原则后,实际上已经不存在分层的概念了。无论是高层还是低层,都只依赖于抽象,好像把整个分层架构给推平了一样。推平后的分层架构如下图:

给推平的分层架构补上左侧对称的另一半,其结果就类似六边形架构,如下图是六边形架构。

六边形架构也叫端口和适配器。在这种架构中,针对系统输入输出的不同交互方式,比如http、rpc、mq、数据持久化等,都有与之对应的适配器,适配器又通过应用层API与内部进行交互。

六边形架构让应用程序能够以一致的方式被用户、程序、自动化测试、批处理脚本所驱动,而且能够让应用程序的边界更加清晰。有关六边形架构的详细信息可以查看 六边形架构原文翻译

五、为什么不选择整洁架构?

整洁架构是Bob大叔在其《架构整洁之道》一书中,对六边形架构和其他类似架构做了总结和抽象之后,提出的一种架构设计理念。

书中总结出,六边形架构和其他类似架构设计出来的系统,都具有相同的特点:

独立于框架:这些系统的架构并不依赖某个功能丰富的框架之中的某个函数。框架可以被当成工具来使用,但不需要让系统来适应框架。 可被测试:这些系统的业务逻辑可以脱离UI、数据库、Web服务以及其他的外部元素来进行测试。 独立于UI:这些系统的UI变更起来很容易,不需要修改其他的系统部分。 独立于数据库:我们可以轻易将这些系统使用的Oracle、SQL Server替换成Mongo、BigTable、CouchDB之类的数据库。因 为业务逻辑与数据库之间已经完成了解耦。 独立于任何外部机构:这些系统的业务逻辑并不需要知道任何其他外部接口的存在。

综合以上所有架构的设计理念,Bob大叔提出了整洁架构设计理念,如下图。

以上图中同心圆分别代表了软件系统的不同层次,通常越靠近中心,其所在的软件层次就越高。

整洁架构规定了层之间的依赖关系规则:内层(高层)不依赖外层(低层),六边形架构层之间的依赖关系也遵从此规则。

至此可以认为整洁架构是一种架构设计的指导思想,六边形架构是整洁架构的一种具体的架构设计。

六、总结

采用依赖倒置原则后的分层架构和六边形架构,实际上都符合整洁架构设计理念。但是六边形架构中使用端口与适配器,让应用程序能够以一致的方式被用户、程序、自动化测试、批处理脚本所驱动,同时能够让应用程序边界更加清晰,从而能更好地防止领域层和应用层逻辑泄露到外层。

七、参考

1.《实现领域驱动设计》

2.《架构整洁之道》

作者:京东零售 加文雄

来源:京东云开发者社区

标签:依赖,资源库,分层,架构,整洁,六边形,DDD
From: https://www.cnblogs.com/Jcloud/p/17571346.html

相关文章

  • 分布式架构-Redisson 框架介绍使用
    分布式架构-Redisson框架介绍使用**一、Redisson**Redisson是架设在Redis基础上的一个Java驻内存数据网格。在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势,在Java实用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类。使得原本......
  • 频谱仪基础(一)--- 频谱仪的架构
    前言无线电通信中最常见的测量任务之一是测试信号的频域特性。因此频谱分析仪作为更广泛和更宽的RF测量工具,其覆盖频率范围高达40GHz及以上,频谱分析测量,几乎可以用于所有无线应用开发、生产、安装和有线通信维护工作。随着移动通信的发展,一些主要关键指标,例如显示的平均噪声电......
  • 插件模式架构图
    实现插件模式架构图前言在软件开发中,插件模式是一种常用的架构设计模式,它可以使代码具备可扩展性和灵活性,允许在不修改原有代码的情况下添加新功能或改变现有功能。本文将介绍如何实现插件模式架构图,帮助刚入行的开发者快速上手。整体流程下表展示了实现插件模式架构图的整体流......
  • 二层改三层网络架构
    从二层到三层网络架构的演进随着网络规模的不断扩大和业务的增加,二层网络架构在一些场景下已经无法满足需求,于是逐渐出现了三层网络架构的概念。本文将重点讨论二层改三层网络架构的原因、特点以及示例代码。二层网络架构的问题二层网络架构主要基于MAC地址进行转发,通过交换机实......
  • vue的物理架构
    Vue的物理架构实现流程为了帮助刚入行的小白理解Vue的物理架构,下面将详细介绍实现的流程,并提供相应的代码示例。步骤概览以下是实现Vue的物理架构的步骤概览:步骤描述1.创建Vue实例初始化Vue应用程序2.创建根组件定义Vue应用程序的根组件3.创建子组件定义V......
  • 使用docker拉取arm架构的镜像
    使用Docker拉取ARM架构的镜像作为一名经验丰富的开发者,你需要教导一位刚入行的小白如何使用Docker来拉取ARM架构的镜像。下面将为你详细介绍整个操作流程,并提供每一步所需的代码和注释。操作流程下面是使用Docker拉取ARM架构的镜像的步骤:步骤操作代码示例步骤一安装......
  • 框架图和架构图的区别
    框架图和架构图的区别概述在软件开发领域,框架图和架构图是两个常用的概念,它们分别描述了软件系统的不同方面。在本文中,我将为你解释框架图和架构图的区别,并指导你如何创建它们。1.确定需求在开始之前,我们需要明确我们的目标和需求。框架图和架构图的设计是为了更好地理解和描......
  • 鲲鹏920ARM架构的Linux系统运行的docker-compose
    实现鲲鹏920ARM架构的Linux系统运行的docker-compose作为一名经验丰富的开发者,我很乐意指导你如何实现鲲鹏920ARM架构的Linux系统运行的docker-compose。下面是整个过程的步骤:步骤说明步骤一安装Docker步骤二配置鲲鹏920的ARM架构环境步骤三安装docker-compo......
  • 异步处理架构应用范围
    异步处理架构应用范围异步处理架构是一种在软件开发中广泛应用的设计模式,它可以提高系统的性能和可伸缩性,并改善用户体验。在本文中,我们将介绍异步处理架构的概念、应用范围以及一个简单的代码示例。什么是异步处理架构?在传统的同步处理架构中,一个请求到达系统后,系统会立即处理......
  • 最新的技术架构
    最新的技术架构介绍概述随着技术的不断发展,新的技术架构不断涌现,以满足日益增长的需求。本文将介绍一种最新的技术架构,并提供相应的代码示例,以帮助读者更好地理解和应用这一技术架构。技术架构简介最新的技术架构是一种基于微服务架构和容器化技术的架构模式。它通过将系统拆分......