【基于电商履约场景的 DDD 实战】阿里巴巴开源的 Cola 架构设计

欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

基于电商履约场景的 DDD 实战

在这里插入图片描述

阿里巴巴开源的 Cola 架构设计

Alibaba 开源了 Cola 架构,目前发展到了 Cola 4.0,Cola 的思想与 DDD 建模设计有一些相通之处,但并不是完全一样,

Cola 架构不仅提供了建模思想,而且提供了可落地的工具和实践指导

Cola 架构的具体内容,可以在 CSDN 上详细看张建飞大佬写的文章!这里我主要将核心部分给写下来!

应用架构的本质就是将类与类、包与包之间的组织关系变得更加清晰,易于维护,达到高内聚、低耦合!

好的应用架构都遵循着一个规律:以业务为中心进行建模

Cola 架构的层次划分为:Adapter 层、Application 层、Domain 层、Infrastructure 层
在这里插入图片描述

1、适配层(Adapter Layer):负责与外界进行交互

2、应用层(Application Layer):负责获取输入,组装上下文,调用领域层进行业务处理,也可以直接访问基础设施层

3、领域层(Domain Layer):封装了核心业务逻辑,为 App 层提供业务实体以及业务逻辑计算

4、基础设施层(Infrastructure Layer):负责技术细节问题的处理,如数据库的 CRUD、RPC、搜索引擎等

分层是大粒度的职责划分,接下来还要更细粒度的进行包结构的划分,才能具体的指导代码结构

在这里插入图片描述

  • Adapter 层:
    • web 负责处理 Controller
    • wireless 负责处理无线端的适配
    • wap 负责处理 wap 端的适配
  • App 层
    • executor 负责处理 request
    • consumer 负责处理外部 message
    • scheduler 负责处理定时任务
  • Domain 层
    • model 领域模型
    • ability 领域能力,包括 DomainService
    • gateway 领域网关,用于解耦
  • Infrastructure 层
    • gatewayimpl 网关的实现
    • mapper 数据库映射
    • config 配置信息
  • Client SDK
    • api 服务对外提供的 API
    • dto 服务对外的 DTO

DDD 对设计能力要求很高,设计的好不好,要看以下三点:

  • 有没有帮助系统解耦
  • 有没有提高业务语义表达能力
  • 有没有提高系统的可维护性和可观测性

Cola 代码架构

接下来我们先去 COLA 源码仓库把代码下载下来,分析一下 COLA 架构如何设计,之后再去完成电商履约场景的代码设计

整个 Cola 架构如下图,包括了 5 个部分:

在这里插入图片描述

接下来说一下 Web 请求的整个调用流程:

在这里插入图片描述

  • Web 请求的入口就是 adapter 层的 Controller,在 Controller 中,接收命令参数(Query、Command),并且调用 Service 服务来进行处理
  • Service 接口在 client 层,Service 实现类在 app 层,因此最终是走到 app 层进行业务逻辑的处理
  • 在 app 的 Service 实现类中,会调用 Executor(app 层) 来对 Command 进行处理,在 Executor 中通过 Mapper(infra 层) 来操作数据库,通过数据库查询出来的对象是 DO(infra 层),将 DO 转换为 CO(client 层)进行返回

更复杂一些的逻辑流程

上边说了一个简单逻辑的流程

接下来说一下稍微复杂一些的保存操作,如果在保存之后,还需要发布一个事件,那就需要使用 Gateway 来进行解耦操作,将保存数据的操作和发布事件的操作给提取到 Gateway 中去,那么 Executor 就只需要调用 Gateway 的保存方法即可,数据库的操作以及事件的发布全部交给 GatewayImpl 来做如下:

在这里插入图片描述

至此,Cola 架构整体的一个流程就梳理完毕了,还有一些细节地方没有说,比如 Convertor,这个就相当于 DDD 中的防腐层,用于将外部对象转为内部对象,比如将 web 端发来的 DTO 对象转为内部的 DO 对象等等

这些细节的东西会在接下来的实战环节说明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/248095.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构:顺序表】

文章目录 线性表顺序表1.1 顺序表结构的定义1.2 初始化顺序表1.3 检查顺序表空间1.4 打印1.5 尾插1.6 头插1.7 尾删1.8 头删1.9 查找1.10 指定位置插入1.11 删除指定位置数据1.12 销毁顺序表 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一…

vue3封装el-pagination分页组件

1、效果如图&#xff1a; 2、分页组件代码&#xff1a; <template><div class"paging"><el-config-provider :locale"zhCn"><el-paginationv-model:current-page"page.currentPage"v-model:page-size"page.pageSize…

C语言第十三弹---VS使用调试技巧

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 VS调试技巧 1、什么是bug 2、什么是调试&#xff08;debug&#xff09;&#xff1f; 3、Debug和Release​编辑​ 4、VS调试快捷键 4.1、环境准备 4.2、调试…

详讲api网关之kong的基本概念及安装和使用(一)

什么是api网关 前面我们聊过sentinel&#xff0c;用来限流熔断和降级&#xff0c;如果你只有一个服务&#xff0c;用sentinel自然没有问题&#xff0c;但是如果是有多个服务&#xff0c;特别是微服务的兴起&#xff0c;那么每个服务都使用sentinel就给系统维护带来麻烦。那么网…

【大数据】Flink SQL 语法篇(二):WITH、SELECT WHERE、SELECT DISTINCT

Flink SQL 语法篇&#xff08;二&#xff09; 1.WITH 子句2.SELECT & WHERE 子句3.SELECT DISTINCT 子句 1.WITH 子句 应用场景&#xff08;支持 Batch / Streaming&#xff09;&#xff1a;With 语句和离线 Hive SQL With 语句一样的&#xff0c;语法糖 1&#xff0c;使用…

成本更低、更可控,云原生可观测新计费模式正式上线

云布道师 在上云开始使用云产品过程中&#xff0c;企业一定遇见过两件“讨厌”事&#xff1a; 难以理解的复杂计费逻辑&#xff0c;时常冒出“这也能收费”的感叹&#xff1b; 某个配置参数调节之后&#xff0c;云产品使用成本不可预估的暴涨。 可观测作为企业 IT 运维必须品…

Python基础(二十九、pymsql)

文章目录 一、安装pymysql库二、代码实践1.连接MySQL数据库2.创建表格3.插入数据4.查询数据5.更新数据6.删除数据 三、完整代码示例四、结论 使用Python的pymysql库可以实现数据存储&#xff0c;这是一种连接MySQL数据库的方式。在本篇文章中&#xff0c;将详细介绍如何使用pym…

【LeetCode每日一题】56. 合并区间插入区间

一、判断区间是否重叠 力扣 252. 会议室 给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 思路分析 因为一个人在同一时刻只能参加一个会…

Django知识随笔

目录 1.如何再ajax中传输post数据&#xff1f; 2.在form表单中使用jquery序列化&#xff0c;input框过多。 1.如何再ajax中传输post数据&#xff1f; 在ajax传递的那个网址&#xff0c;会调用你路由的视图函数&#xff0c;在视图函数上面加一句 csrf_exempt 。写上之后会有提…

获取依赖aar包的两种方式-在android studio里引入 如:glide

背景&#xff1a;我需要获取aar依赖到内网开发&#xff0c;内网几乎代表没网。 一、 如何需要获取依赖aar包 方式一&#xff1a;在官方的github中下载,耗时不建议 要从开发者网站、GitHub 存储库或其他来源获取 ‘com.github.bumptech.glide:glide:4.12.0’ AAR 包&#xff…

应急消防应用步入“繁花”时代,卓翼智能消防无人机顺势而行大有可为

近日&#xff0c;北京卓翼智能科技有限公司&#xff08;以下简称“卓翼智能”&#xff09;宣布完成超亿元B轮融资&#xff0c;融资金额高达2.5亿元。这个“智能无人系统”黑马品牌&#xff0c;凭什么出圈&#xff1f;重点发力在哪些领域呢&#xff1f;今天&#xff0c;带你走进…

CodeLocator 避免控制台弹出一堆错误日志

现象 使用codeLocator 插件 控制台经常打印出一堆的错误日志。和项目本身无关。影响了我们排查错误的效率。 解决办法 在Application的onCreate方法中加入下面的代码。 //避免控制台弹出一堆的错误日志CodeLocator.config(new CodeLocatorConfig.Builder().enableHookInfla…

xcode安装visionOS Simulator模拟器报错解决方法手动安装方法

手动安装方法&#xff1a; 手动下载visionOS Simulator模拟器地址&#xff1a; https://developer.apple.com/download/all/ 选择 Xcode 版本 sudo xcode-select -s /Applications/Xcode.app # 用 Xcode-beta 的话是&#xff1a; # xcode-select -s /Applications/Xcode-beta…

Shell中正则表达式

1.正则表达式介绍 1、正则表达式---通常用于判断语句中&#xff0c;用来检查某一字符串是否满足某一格式 2、正则表达式是由普通字符与元字符组成 3、普通字符包括大小写字母、数字、标点符号及一些其他符号 4、元字符是指在正则表达式中具有特殊意义的专用字符&#xff0c…

Java集合-Map接口(key-value)

Map接口的特点&#xff1a;①KV键值对方式存储②Key键唯一&#xff0c;Value允许重复③无序。 Map有四个实现类&#xff1a;1.HashMap类2.LinkedHashMap类3.TreeMap类4.Hashtable类 1.HashMap类&#xff1a; 存储结构&#xff1a;哈希表 数组Node[ ] 链表&#xff08;红黑…

STM32的GPIO的详细配置指南

1. GPIO简介 GPIO&#xff08;General Purpose Input/Output&#xff09;是用于在微控制器中与外部世界通信的接口。通过GPIO&#xff0c;微控制器可以控制外部设备&#xff08;如LED、LCD、按键等&#xff09;的状态&#xff0c;也可以接收外部设备的状态&#xff08;如传感器…

用AI工具一键生成原创文案的方法

一键生成原创文案对于文案工作者来说它是一种高效率创作文案内容的方法。文案工作者知道创作文案是一件消耗精力和时间的事情&#xff0c;遇到没有创作灵感&#xff0c;想要写一篇高质量的文案内容简直难上加难&#xff0c;因此&#xff0c;互联网上出现了一键生成原创文案的方…

Linux下安装edge

edge具有及其强大的功能&#xff0c;受到很多人的喜爱&#xff0c;它也开发Linux版本&#xff0c;下面是安装方法&#xff1a; 1.去edge官网下载Linux(.deb)文件。 https://www.microsoft.com/zh-cn/edge/download?formMA13FJ 2.下载之后输入以下指令&#xff08;后面是安装…

【算法专题】贪心算法

贪心算法 贪心算法介绍1. 柠檬水找零2. 将数组和减半的最少操作次数3. 最大数4. 摆动序列(贪心思路)5. 最长递增子序列(贪心算法)6. 递增的三元子序列7. 最长连续递增序列8. 买卖股票的最佳时机9. 买卖股票的最佳时机Ⅱ(贪心算法)10. K 次取反后最大化的数组和11. 按身高排序12…

WPOpenSocial实现WordPress的QQ登录

个人建站不可避免的需要自己搭建用户数据库的问题&#xff0c;可用户却往往因为注册繁琐而放弃浏览您的网站&#xff0c;由此可见&#xff0c;一个社交账号一键登录方式尤为重要。选择适合您网站需求的社交插件&#xff0c;可以提升用户互动&#xff0c;增加社交分享&#xff0…