Su的技术博客

  • 首页
  • 原创
  • 视频
  • Java
  • MySQL
  • DDD
  • 事故复盘
  • 架构方案
  • AI
  • Other
  • 工具
    • AI工具集
    • 工具清单
    • JSON在线格式化
    • JSON在线比较
    • SQL在线格式化
  • 打赏
  • 关于
路很长,又很短
  1. 首页
  2. DDD
  3. 正文
                           

【京东零售】DDD架构为什么应该首选六边形架构?

2023-09-04 1788点热度 0人点赞 0条评论
一、传统分层架构
分层架构的一个重要原则是:每层只能与位于其下方的层发生耦合。
分层架构分两种:一种是严格分层架构,规定某层只能与直接位于其下方的层发生耦合;另一种是松散分层架构,允许任意上方层与任意下方层发生耦合。
下图是一个典型的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大叔提出,其定义如下:

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

    抽象不应该依赖于细节,细节应该依赖于抽象。

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

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

四、六边形架构

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

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

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

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

六边形架构也叫端口和适配器。在这种架构中,针对系统输入输出的不同交互方式,比如http、rpc、mq、数据持久化等,都有与之对应的适配器,适配器又通过应用层API与内部进行交互。
六边形架构让应用程序能够以一致的方式被用户、程序、自动化测试、批处理脚本所驱动,而且能够让应用程序的边界更加清晰。有关六边形架构的详细信息可以查看 https://zhuanlan.zhihu.com/p/113681224(六边形架构原文翻译)
五、为什么不选择整洁架构

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

书中总结出,六边形架构和其他类似架构设计出来的系统,都具有相同的特点:
    独立于框架:这些系统的架构并不依赖某个功能丰富的框架之中的某个函数。框架可以被当成工具来使用,但不需要让系统来适应框架。

    可被测试:这些系统的业务逻辑可以脱离UI、数据库、Web服务以及其他的外部元素来进行测试。

    独立于UI:这些系统的UI变更起来很容易,不需要修改其他的系统部分。

    独立于数据库:我们可以轻易将这些系统使用的Oracle、SQL Server替换成Mongo、BigTable、CouchDB之类的数据库。因为业务逻辑与数据库之间已经完成了解耦。

    独立于任何外部机构:这些系统的业务逻辑并不需要知道任何其他外部接口的存在。

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

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

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

整洁架构规定了层之间的依赖关系规则:内层(高层)不依赖外层(低层),六边形架构层之间的依赖关系也遵从此规则。
至此可以认为整洁架构是一种架构设计的指导思想,六边形架构是整洁架构的一种具体的架构设计。
六、总结

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

七、参考

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

2. 《架构整洁之道》

本文仅供学习!所有权归属原作者。侵删!文章来源: 京东零售技术 -同城研发 加文雄 :http://mp.weixin.qq.com/s/61Ppm-MEdFrc7qrC2z_cKA

更多文章:

  1. 殷浩详解DDD 第三讲 - Repository模式
  2. DDD系列第五讲:聊聊如何避免写流水账代码
  3. 解构领域驱动设计(二):分层架构
  4. 解构领域驱动设计(一):为什么DDD能够解决软件复杂性
  5. 解构领域驱动设计(三):领域驱动设计
  6. 关于聚合根、领域事件的那点事——深入浅出理解DDD
  7. 殷浩详解DDD系列 第二讲 - 应用架构
  8. 京东平台研发朱志国:领域驱动设计(DDD)理论启示
  9. Go整洁架构实践
  10. 大家一直在谈的领域驱动设计(DDD),我们在互联网业务系统是这么实践的
标签: 京东零售 架构 ddd 领域驱动设计 整洁架构 依赖倒置原则 六边形架构 分层架构
最后更新:2023-09-04

coder

分享干货文章,学习先进经验。

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

广告
最新 热点 推荐
最新 热点 推荐
微服务架构:必懂的6大性能维度 Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代 视频笔记-微服务架构P4:必懂5种设计模式 视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构 干货 | 论Elasticsearch数据建模的重要性 马蜂窝消息总线——面向业务的消息服务设计 基于 MySQL Binlog 实现可配置的异构数据同步 视频笔记:Google发布Agent2Agent协议
视频笔记:微服务架构P4 设计模式:每服务数据库、API 网关和事件驱动架构干货 | 论Elasticsearch数据建模的重要性视频笔记-微服务架构P4:必懂5种设计模式Anthropic Code with Claude 开发者大会:开启 AI Agent 新时代微服务架构:必懂的6大性能维度
45 个 Git 经典操作场景,专治不会合代码 阿里云香港云服务器P0史诗级宕机事件复盘 JVM 内存分析神器 MAT: Shallow Heap Vs Retained Heap 你理解的对吗? 【视频】NettyInAction作者:统治一切的框架Netty- One Framework to rule them all Eureka源码剖析之三:服务拉取 6种限流实现,附代码![通俗易懂] 研发日常踩坑-Mysql分页数据重复 干货 | 论Elasticsearch数据建模的重要性

CRUD (1) Event Sourcing (1) graphql (1) id (1) NoSQL (1) quarkus (1) rest (1) RocketMQ (2) Spring Boot (1) zk (1) zookeeper (1) 上下文 (1) 事务消息 (1) 二级缓存 (1) 值对象 (1) 关系数据库 (1) 分布式缓存 (1) 原子性 (1) 唯一ID (1) 商品 (1) 多对多 (1) 子域 (1) 字符集 (1) 客户端心跳 (1) 幂等 (2) 干货 (1) 并发 (1) 应用场景 (1) 应用架构图 (1) 康威定律 (2) 异步复制 (1) 微服务架构 (3) 总体方案 (1) 技术方案 (2) 技术架构 (2) 技术架构图 (1) 技能 (1) 持续集成 (1) 支撑域 (1) 故障恢复 (1) 数据架构图 (1) 方案选型 (1) 日记 (1) 服务发现 (1) 服务治理 (1) 服务注册 (2) 机房 (1) 核心域 (1) 泄漏 (1) 洋葱架构 (1) 消息队列 (5) 源码剖析 (1) 灰度发布 (1) 熔断 (1) 生态 (1) 画图工具 (1) 研发团队 (1) 线程 (2) 组织架构 (1) 缓存架构 (1) 编码 (1) 视频 (20) 读写分离 (1) 贵州 (1) 软件设计 (1) 迁移 (1) 通用域 (1) 集群化 (1) 雪花算法 (1) 顺序消息 (1)

推荐链接🔗
  • AI工具集
  • 工具箱🛠️

COPYRIGHT © 2014-2025 verysu.com . ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

粤ICP备15033072号-2