代码编织梦想

目录

1、前言

2、四层架构&洋葱架构介绍 

四层架构

洋葱架构

洋葱架构详解​​​​​​​

3、交易系统中的设计

四层架构调用链接、各层职责

各层之间数据模型传递规范

电商业务交易创建订单DDD分层及类依赖关系

三、DDD架构优缺点

DDD优点

DDD缺点


1、前言

    在交易中台中主要使用的是基于四层架构的洋葱架构,并同时应用了CQRS、事件驱动架构设计。

2、四层架构&洋葱架构介绍 

四层架构

 1.用户界面层(User Interface Layer):负责与用户交互,包括图形界面、命令行界面、API等,有时也可单理解为用户接口层,即为端上提供接口的层;

2.应用服务层(Application Services Layer):负责接收及处理用户请求,并通过协调各个领域服务完成应用程序的业务逻辑。

3.领域层(Domain Layer):负责实现业务领域的核心逻辑,处理业务流程、规则等。领域层使用领域实体(Entity)、值对象(Value Object)、聚合(Aggregate)等模型与其它层进行交互。

4.基础设施层(Infrastructure Layer):包括与外部系统的交互、数据库访问、缓存、消息队列等底层实现,为上层各层提供支持。

四层架构在实践中又可分为:

  • 严格分层架构:某层只能与位于其直接下方的层发生耦合

  • 松散分层架构:允许某层与它的任意下方层发生耦合。

    • 特点:更加灵活,比较适合传统分层架构向DDD分层架构的演进。

四层架构相比传统MVC三层架构来说,Model层更加细分,第一层职责更加明确。

洋葱架构

   四层架构如果说是纯理论性的,洋葱架构是更加偏实践性的,洋葱架构通过更加细致的分层及职责划分让软件架构各个领域或分层更加规范和明确。

 

洋葱架构详解

应用构建在领域模型上,系统设计人应更关注领域的划分及设计,不要太多关注技术实现。层之间依赖及调用时,只能外层调用里层,里层不能调用外层,里层感知不到外层的存在。内层是原则(规则),外层主要是实现机制。

在代码依赖上也是从外向内的,内环中的代码不应该知道外环中的任何东西。

Domain Model:业务模型,对应DDD中的Entity、值对象等

Domain Service:核心业务逻辑

Application Service:应用的输入输出层

User Interface/Tests/Application:适配器层

原则

洋葱架构是由多个同心层构成,它们相互连接,并朝向代表领域的核心。它是基于控制反转(Inversion of Control,IoC)的原则。该架构并不关注底层技术或框架,而是关注实际的领域模型。越往里面抽象级别越高,最外层的圆是低级别的具体细节。越往里面内容越抽象,并且封装更高级别的原则,最里面的圆是最通用的。

依赖性

圆圈代表不同的责任层。一般来说,越靠近内层,就越接近于领域和业务规则。外圈代表机制,内圈代表核心领域逻辑。外层依赖于内层,而内层则对外圈一无所知。通常情况下,属于外圈声明(包括方法、类、变量或任何软件实体)不能被内圈引用。

例如在数据模型上,外层的数据格式不应该被内层使用,API场景中使用的数据格式可以与 DB 中用于持久化的数据格式不同。数据流可以使用数据传输对象。每当数据跨层/跨界时,它应该以方便该层的形式出现。例如,API 可以有 DTO,DB 层可以有 Entity Objects。

数据封装

每个层/圈封装或隐藏内部的实现细节,并向外层公开接口。每个层定义便于内层使用的数据模型,以最小化层与层之间的耦合。比如User Interface与Application Service、与交互的模型,Application Service层Domain层都会定义不同的数据模型。

3、交易系统中的设计

四层架构调用链接、各层职责

各层之间数据模型传递规范

 场景层也不一定必须需存在,服务层直接进行模型转换为DO后,调用各个子域服务;

重点关注各层之间模型是如何使用及传递的;

电商业务交易创建订单DDD分层及类依赖关系

三、DDD架构优缺点

DDD优点

  1. DDD更擅长用于解决复杂的系统之间的架构分层设计,通过提前确定好各个层的职责及边界,能让系统架构更加规范和清晰;

  2. 在复杂的业务系统中,通过DDD中明确合理的分层,能让开发更聚焦解决某一层或某一领域的问题。

  3. 通过这种设计可以降低层与层之间的依赖,也可以很容易用新的实现来替换原有层的实现。

  4. 有利于标准化,利于各层逻辑的复用。

DDD缺点

  1. DDD相比传统MVC架构有比较高的理解和学习成本;

  2. DDD不是万金油,如果是一个在短期和未来都相对比较简单的一个系统如若使用DDD的话会让开发者非常痛苦;

  3. 使用DDD架构进行后代码量会显著增加,短期内也会不太容易看到收益 ;

DDD入门请看上一篇内容

《DDD第一篇》- DDD基础入门

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/caizi1288/article/details/129671391

ddd学一步写一篇--ddd开发实践流程-爱代码爱编程

DDD大家讨论的比较多的一般都是DDD的思想和理论,很少有文章讨论具体是如何实施和落地,所以这也导致很多同学看完了Evans经典巨著后对DDD还是不知道如何去实施。这篇文章我们讨论下DDD的实施步骤,聊聊怎么一步步在项目中实施DDD。 在习惯了传统的数据驱动开发模式后,View、Service、dao这种三层分层模式,开发者会很自然的写出过程式代码,这种

ddd学习笔记 - 进阶篇(Ⅱ)-爱代码爱编程

  09 | 中台:数字转型后到底应该共享什么? 课程链接:https://time.geekbang.org/column/article/159580   中台是数字化转型的一个热门话题。继阿里提出中台概念后,很多人又提出了各种各样的中台。今天主要讨论业务中台和数据中台。作为企业数字化中台转型的整体,我也会顺带聊一聊前台和后台的一些设计思路。

DDD学习笔记 - 总结篇-爱代码爱编程

19 | 总结(一):微服务设计和拆分要坚持哪些原则 课程链接:https://time.geekbang.org/column/article/171185 由于企业发展历程以及企业技术和文化的不同,DDD 和微服务的实施策略也会有差异。那么面对这种差异,应该如何落地 DDD 和微服务呢?   微服务的演进策略 在从单体向微服务演进时,演进策略

DDD微服务中台设计-理论篇-爱代码爱编程

借用当下最流行的段子做个开场白。 “设计原则千万条,高内聚低耦合第一条,架构设计不规范,开发运维两行泪!”。 在分布式架构下,单体应用被拆分为多个微服务,为了保证微服务的单一职责和合理拆分,“高内聚、松耦合”是最宝贵的设计原则。 通俗点讲,高内聚就是把相关的行为聚集在一起,把不相关的行为放在别处,如果你要修改某个服务的行为,最好只在一处修改。如果做到了服务

DDD实战课--学习笔记-爱代码爱编程

目录 学好了DDD,你能做什么?领域驱动设计:微服务设计为什么要选择DDD?领域、子域、核心域、通用域和支撑域:傻傻分不清?限界上下文:定义领域边界的利器实体和值对象:从领域模型的基础单元看系统设计聚合和聚合根:怎样设计聚合?领域事件:解耦微服务的关键DDD分层架构:有效降低层与层之间的依赖微服务架构模型:几种常见模型的对比和分析中台:数字转型后到底应该

DDD专栏2:DDD实战:从支付功能的优化说起-爱代码爱编程

02、DDD实战:从支付功能的优化说起 ​ 我们前面花了不少篇幅来分析系统老化的问题,也提出了DDD可以有效的防止系统老化。并且给大家简单的介绍了一下DDD的一些思想。 ​ 那接下来,应该就要学习DDD的抽象概念体系了。这会是一个痛苦的过程,所以这一章节,我们先不去深入DDD的概念细节。我们就会以程序员最为直观的方式,代码,来对DDD做一次近距离的接触

DDD实战课(实战篇)--学习笔记-爱代码爱编程

目录 DDD实践:如何用DDD重构中台业务模型?领域建模:如何用事件风暴构建领域模型?代码模型(上):如何使用DDD设计微服务代码模型?代码模型(下):如何保证领域模型与代码模型的一致性?边界:微服务的各种边界在架构演进中的作用?视图:如何实现服务和数据在微服务各层的协作?从后端到前端:微服务后,前端如何设计?知识点串讲:基于DDD的微服务设计实例基于D

DDD(1)-DDD的相关概念-爱代码爱编程

目录 1、领域驱动设计-DDD的概念 1.1、正反例对比 1.2、好差代码对比 1.3、名词解释 1.4、DDD四层架构 2、DDD落地方法 2.1、领域建模-战略 2.2、微服务拆分和设计-战术 1、领域驱动设计-DDD的概念 DDD不是架构,是方法论 1.1、正反例对比 反例 比如一个Web交易系统,凭直觉开发。使用MVC

DDD领域驱动篇——第一章(一文带你领略DDD、微服务和中台设计)-爱代码爱编程

        在讲DDD之前,我对领域驱动曾经有过一段时间的了解,其实这个概念当我第一次听的时候发现很泛化,而且很抽象甚至难以理解,后来我发现这个玩意得需要很多时间、很多框架、技术的演进、软件迭代到了一定的瓶颈,业务愈发复杂而带来一系列架构转变和业务重构的捶打,才可以更好的体会和理解这些新词的意思,本章我就讲下我对DDD的理解和认识,也需要读者能够

DDD之跨层调用的思考-爱代码爱编程

一、背景 最近通过COLA构建篮球运营管理平台演示源码的时候对跨层调用做了一些深度思考,在跨层调用中有些调用并不是严格按规范或者相对固定的分层模式去走的,这就出现了一些疑问,比如不按规范来我怎么控制代码质量,我怎么知道最佳实践是什么? 另外一方面的问题是目前实践DDD的代码和案例确实不是很多,深度集成各种中间件和调用案例的工程也不是很多,大多情况下都是理

DDD学习笔记---进阶篇-爱代码爱编程

  领域事件 用来表示领域中发生的事件。 举例来说的话,领域事件可以是业务流程的一个步骤,比如投保业务缴费完成后,触发投保单转保单的动作;也可能是定时批处理过程中发生的事件,比如批处理生成季缴保费通知单,触发发送缴费邮件通知操作;或者一个事件发生后触发的后续动作,比如密码连续输错三次,触发锁定账户的动作。 领域事件相关案例 事件起点:客户

DDD中的领域拆分和合并-爱代码爱编程

一、背景 在DDD讨论群中与一位群友讨论了一个关于领域服务拆分的问题,这个也涉及到了代码层面的操作和设计,比如一个领域服务中包含多个子领域,随着业务的发展或者迭代,某个子领域需要拆出来独立迭代。很多程序员多少都会遇到这种情况,尤其是分布式微服务下的架构模式,因此本文就这个话题着重讨论一下DDD中的领域上下文的拆分和合并。 二、DDD关于领域拆分和合并的

ddd领域驱动设计深度解析_rocky-yang的博客-爱代码爱编程

目录 DDD领域驱动设计深度解析DDD凝聚了软件工程的智慧DDD领域驱动设计的历史什么是领域 Domain领域驱动设计领域驱动设计几大原则详解领域驱动模型的概念领域驱动设计的挑战 DDD领域驱动设计深度解析 DDD凝聚了软件工程的智慧 ​ 许多人对微服务设计中经常提及的DDD非常推崇,觉得这是最新的架构设计趋势和解决微服务业务划分的终极方法

ddd领域驱动设计-事件风暴_haoxin963的博客-爱代码爱编程

事件风暴(Event Storming)是一种灵活的研讨会格式,用于协作探索复杂的业务领域 。 事件风暴通过工作坊的形式,由PM、RD、业务各方共同参与的, 发现并对齐领域知识。比较传统的做法是找一面大的白版,使用各种颜色的便签纸填写相关内容,往白板上粘贴。现在也有一些更便捷的支持协作的在线工具可供使用:BeeArt。 核心概念 领域事件(Ev

如何利用基于充血模型的ddd开发一个虚拟钱包系统?_树懒很努力的博客-爱代码爱编程

上篇文章总结了一些理论知识的铺垫性讲解,讲到了两种开发模式,基于贫血模型的传统开发模式,以及基于充血模型的 DDD 开发模式。今天,我们正式进入实战环节,看如何分别用这两种开发模式,设计实现一个钱包系统。

jvm监控搭建-爱代码爱编程

文章目录 JVM监控搭建整体架构JolokiaTelegrafInfluxdbGrafana JVM监控搭建 整体架构 JVM 的各种内存信息,会通过 JMX 接口进行暴露。 Jolokia

柴华:ddd在哈啰交易中台的实践-爱代码爱编程

本文根据柴华老师在〖deeplus直播第273期〗线上分享演讲内容整理而成。(文末有回放的方式,不要错过) 柴华 哈啰出行 交易中台团队技术负责人 2019年加入哈啰出行共享团队,期间完成了交易、保险、发票、评价等多个领域能力落地,且主导了哈啰出行核心业务线的接入。目前是哈啰出行交易中台团队技术负责人,致力于提升业务线交易域研发效率