DDD+SOA的事件驱动微服务读写分离架构

DDD

DDD是Eric Evans于2003年出版的书名,同时也是这个架构设计方法名的起源
Eric Evans “领域驱动设计之父”,世界杰出软件建模专家。
他创建了Domain Language公司,致力于帮助公司机构创建与业务紧密相关的软件。
他在世界各地宣讲领域驱动设计(Domain-Driven Design,DDD)的思想,开设课程,参加会议,接受专访,拥有大批的追随者。
从20世纪80年代开始,他就以设计师和程序员的双重身份参与过许多大型面向对象系统的设计和开发,涉及各种复杂的业务和技术领域。
同时,他还培训和指导过许多开发团队开展极限编程实践。

DDD的好处是啥

在这里插入图片描述

Domain Driven Design

DDD不是架构,而是一种方法论(Methodology)
微服务架构从一出来就没有很好的理论支撑如何合理的划分服务边界,人们常常为服务要划分多大而争吵不休

四色原型建模

某个人(Party)的角色(PartyRole)在某个地点(Place)的角色(PlaceRole)用某个东西(Thing)的角色(ThingRole)做了某件事情(MomentInterval)

分层架构

分层架构是将软件模块按照水平切分的方式分成多个层
最基本的是分层架构是三层,即表现层,领域层和数据持久层
DDD中 四层架构 表现层,应用层、领域层和基础层
四层中的应用层是对三层架构中领域层进行进一步拆分。但是无论怎么分层,业务逻辑永远在领域层。

三层架构:

  • 表现层:负责向用户展示信息和接收用户的指令。需要负责处理展示逻辑,比如用户通过我们的系统进行信用卡还款,系统会返回三个状态未申请,处理中,处理完成。表面层需要根据这个状态给用户返回不同的页面,根据这三个不同的状态,向用户展示不同的中文说明。
  • 领域层:负责表达业务逻辑,是整个系统的核心层。比如信用卡还款服务。
  • 持久层:提供数据查询和存储服务,包括按照状态查询信用卡。

四层架构

  • 表现层:同三层架构表现层。
  • 应用层:定义软件要完成的任务,不包含业务逻辑,而是协调,比如受理用户请求的任务。负责非业务逻辑(批量删除、修改等)
  • 领域层:同三层架构领域层。
  • 基础层:为各层提供通用的技术能力。为领域层提供数据和文件存储。
    在这里插入图片描述
    分层架构最重要的是每一层关注自己的职责,持久层只负责提供查询、更新和存储数据的服务,和业务逻辑无关的,所以持久层提供按照还款状态查询信用卡的服务,这样做的好处增加复用性,后续领域层提供展示已还款的信用卡服务时能复用持久层的查询服务。

分层架构的好处

分层架构的目的是通过关注点分离来降低系统的复杂度,同时满足单一职责、高内聚、低耦合、提高可复用性和降低维护成本。

-单一职责:每一层只负责一个职责,职责边界清晰,如持久层只负责数据查询和存储,领域层只负责处理业务逻辑。

  • 高内聚:分层是把相同的职责放在同一个层中,所有业务逻辑内聚在领域层。这样做有什么好处呢?试想一下假如业务逻辑分散在每一层,修改功能需要去各层修改,测试业务逻辑需要测试所有层的代码,这样增加了整个软件的复杂度和测试难度。
  • 低耦合:依赖关系非常简单,上层只能依赖于下层,没有循环依赖。
  • 可复用:某项能力可以复用给多个业务流程。比如持久层提供按照还款状态查询信用卡的服务,既可以给申请信用卡做判断使用,也可以给展示未还款信用卡使用。
  • 易维护:面对变更容易修改。把所有对外接口都放在对外接口层,一旦外部依赖的接口被修改,只需要改这个层的代码即可。

以上这些既是分层的好处也是分层的原则,大家在分层时需要遵循以上原则,不恰当的分层会违背了分
层架构的初衷。

分层架构的缺点

分层架构也有几个缺点

  • 开发成本高:因为多层分别承担各自的职责,增加功能需要在多个层增加代码,这样难免会增加开发成本。但是合理的能力抽象可以提高了复用性,又能降低开发成本。
  • 性能略低:业务流需要经过多层代码的处理,性能会有所消耗。
  • 可扩展性低:因为上下层之间存在耦合度,所有有些功能变化可能涉及到多层的修改

领域模型 domain model

领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、业务对象模型、领域对象模型、分析对象模型。
在这里插入图片描述
它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。
优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Business Logic->Data Access Object。可见,领域对象几乎只作传输介质之用,不会影响到层次的划分。
领域对象只是作为保存状态或者传递状态使用,它是没有生命的,只有数据没有行为的对象不是真正的对象

贫血模型

指领域对象里只有get和set方法(POJO),所有的业务逻辑都不包含在内而是放在Business Logic层

在使用Spring的时候,通常暗示着你使用了贫血模型,我们把Domain类用来单纯地存储数据,Spring管不着这些类的注入和管理,Spring关心的逻辑层(比如单例的被池化了的Business Logic层)可以被设计成singleton的bean。
假使我们这里逆天而行,硬要在Domain类中提供业务逻辑方法,那么我们在使用Spring构造这样的数据bean的时候就遇到许多麻烦,比如:bean之间的引用,可能引起大范围的bean之间的嵌套构造器的调用。

充血模型

大多业务逻辑和持久化放在Domain Object里面,Business Logic只是简单封装部分业务逻辑以及控制事务、权限等,这样层次结构就变成Client->(Business Facade)->Business Logic->Domain Object->Data Access Object。

在这里插入图片描述

优点

是面向对象,Business Logic符合单一职责,不像在贫血模型里面那样包含所有的业务逻辑太过沉重。

缺点

是如何划分业务逻辑,什么样的逻辑应该放在Domain Object中,什么样的业务逻辑应该放在Business Logic中,这是很含糊的。
即使划分好了业务逻辑,由于分散在Business Logic和Domain Object层中,不能更好的分模块开发。
熟悉业务逻辑的开发人员需要渗透到Domain Logic中去,而在Domian Logic又包含了持久化,对于开发者来说这十分混乱。
如果Business Logic要控制事务并且为上层提供一个统一的服务调用入口点,它就必须把在Domain Logic里实现的业务逻辑全部重新包装一遍,完全属于重复劳动。
使用RoR开发时, 每一个领域模型对象都可以具备自己的基础业务方法,通常满足充血模型的特征。充血模型更加适合较复杂业务逻辑的设计开发。
充血模型的层次和模块的划分是一门学问,对开发人员要求亦较高,可以考虑定义这样的一些规则:
(1)事务控制不要放在领域模型的对象中实现,可以放在facade中完成。
(2)领域模型对象中只保留该模型驱动的一般方法,对于业务特征明显的特异场景方法调用放在facade中完成

传统的数据驱动开发模式

View、Service、dao这种三层分层模式,开发者会很自然的写出过程式代码,这种开发方式中的对象只是数据载体,而没有行为,是一种贫血对象模型。以数据为中心,以数据库ER图为设计驱动,分层架构在这种开发模式下可以认为是数据处理和实现的过程。

Bounded Context

定义了每个模型的应用范围

什么是 CQRS?

CQRS — Command Query Responsibility Segregation,故名思义是将 command 与 query 分离的一种模式。query 很好理解,就是我们之前提到的「查询」,那么 command 即命令又是什么呢?
我们仔细看CRUD, 其实可以更简单的分为读®和写(CUD), 我们想想大部分情况都是,一个方法要么是执行一个Command完成一个动作,要么就是查询返回数据。 比如我们回答问题的人不应该去修改问题。
当我们读写分离后,我们对应的代码也会分离。

Event Sourcing

追溯

统一语言(Ubiquitous Language)

业务人员和我们使用一样的语言,我们的程序比如让业务尽量集中在领域里,比如在传统的数据驱动里,如果说Jack爱Rose, 我们一般会这么写

UserService.Love(Jack, Rose)

但是我们业务人员很奇怪谁Love谁? 为什么要UserService?, 如果我们写成下面这样

Jack.Love(Rose)

还有如果我们用

Company.hire(employee)

来代替

companyservice.hire(company,employee)

这样就更容易让业务人员参与进来,而且代码可以更易于表示真实的业务场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序算法之插入排序c++

介绍 插入排序:将数组分成“已排序”和“未排序”两部分。初始时,已排序的部分 包含一个元素,然后从未排序的部分中取出元素,并在已排序的部分中找 到合适的位置进行插入,并保持已排序的部分一直有序。 重复这个过程&…

计算机网络学习笔记(一)

文章目录 1.1 请介绍七层网络体系结构。2 .请介绍五层网络体系结构。3 .了解网络编程协议吗?客户端发送给服务器的请求,怎么确定具体的协议?4. TCP、HTTP、FTP分别属于哪一层?5. 讲一下TCP/IP协议。6 .说一说你对ARP协议的理解。7…

IDC发布23Q3中国存储市场报告:浪潮信息逆势增长位居前二!

近日,权威调研机构IDC公布《中国企业级外部存储市场跟踪报告,2023Q3》。报告显示,2023年第三季度,中国企业级存储(ESS)市场规模达17.1亿美元,同比下降2.8%。其中,浪潮信息存销售额同比增长10.9%&#xff0c…

论文阅读: Semantics-guided Triplet Loss

ICCV 2021 Abstract 一个度量学习方法,通过浏览语义引导的局部集合去优化内在深度表示。一个新颖的特征融合模块能有效利用跨模态特异质特征。 Senantics-guided Triplet Loss 基本假设: 在场景语义分割图像中,目标内部相邻像素拥有同样…

速通C语言第十二站 文件操作

系列文章目录 速通C语言系列 速通C语言第一站 一篇博客带你初识C语言 http://t.csdn.cn/N57xl 速通C语言第二站 一篇博客带你搞定分支循环 http://t.csdn.cn/Uwn7W 速通C语言第三站 一篇博客带你搞定函数 http://t.csdn.cn/bfrUM 速通C语言第四站 一篇博客带…

FL Studio Producer Edition 21.2.2中文版所有插件版及使用教程

FL Studio 21.2.2中文版惯称水果编曲, 是一个完整的电音软件音乐制作环境或数字音频工作站。是现在流行的数字音频工作站之一,包括撰写,整理,记录,编辑,电音,混音和掌握专业品质的音乐。 FL Studio Producer Edition 21.2.2.3914 所有插件版是一款功能强大的软件音乐制作环境或…

第三十七周周报:文献阅读+掩码、多头注意力机制+位置编码

目录 摘要 Abstract 文献阅读:基于注意力的LSTM大地震预报网络 现有问题 提出方法 基于注意力的LSTM网络 研究实验 实验目的 数据集 评估指标 数据预处理和特征提取 结果讨论 Masked Self-Attention(掩码自注意力) Muti-Head S…

oracle 9i10g编程艺术-读书笔记2

配置Statspack 安装Statspack需要用internal身份登陆,或者拥有SYSDBA(connect / as sysdba)权限的用户登陆。需要在本地安装或者通过telnet登陆到服务器。 select instance_name,host_name,version,startup_time from v$instance;检查数据文件路径及磁盘空间&…

Primavera Unifier 项目控制延伸:Phase Gate理论:3/3

继续上一篇阶段Gate的具体内容 https://campin.blog.csdn.net/article/details/127827681https://campin.blog.csdn.net/article/details/127827681 阶段 3 研发 前述阶段的计划和安排都要在研发阶段执行起来,同时,最重要的产品设计和开发部分也需要在…

“TypeError: Cannot read properties of null (reading ‘getContext‘)“

目录 一、报错截图 二、使用场景 三、代码截图 四、报错原因 五、解决办法 一、报错截图 二、使用场景 第一次在vue项目种使用canvas,跟着网上教程做,标签canvas写好了,dom元素获取了,简单“画”了一下,运行之后报…

前端显示json格式化

实现效果 在前端页面上展示格式化的JSON数据可以通过以下步骤完成: 获取JSON数据:首先,你需要获取要展示的JSON数据。你可以从后端API获取数据,或者直接在前端定义一个JSON对象。 格式化JSON:使用JavaScript的JSON对…

电池管理系统BMS中SOC算法通俗解析(二)

下面简单介绍下我们BMS保护板使用的SOC估算方法。我们算法的主要是针对电流积分法计算SOC的局限性进行改进: ●电池包第一次上电使用开路电压法估算SOC。第一次上电,根据电池包厂家给出的电压和剩余容量二维关系图大概估算出目前电池包的剩余容量即SOC。…

音视频技术开发周刊 | 326

每周一期,纵览音视频技术领域的干货。 新闻投稿:contributelivevideostack.com。 全球最强「开源版Gemini」诞生!全能多模态模型Emu2登热榜,多项任务刷新SOTA 最强的全能多模态模型来了!就在近日,智源研究院…

ES6之Proxy详解

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…

2024年第一天,先送一波福利!

▼最近直播超级多,预约保你有收获 近期直播:《LLM在电商搜索系统的应用案例实战》 —1— 2024 AIGC 技术体系领取福利 2023年是当之无愧的生成式 AI 元年,AIGC 的崛起深刻改变了我们的工作和生活,让我们看到了未来无限的可能性&am…

gzip引入后node_modules中.cache compression-webpack-plugin占用内存过多

1.Gzip Gzip(GNU zip)是一种常见的文件压缩格式和压缩算法,通常用于在 Web 服务器上对静态资源文件进行压缩,以减小文件大小并加快文件传输速度。在前端开发中,经常会使用 Gzip 压缩来优化网站的性能。 Gzip 压缩通过…

2024校招测试工程师笔试——经典错题记录和解析

大家好,这篇文章记录几个测开方向经典的例题,并给出相应解析,欢迎给出你的看法 下列关于软件性能测试的说法中,正确的是:( ) A 性能测试的目的不是为了发现软件缺陷 B 压力测试与负载测试的目的…

windows11新装机,简单评测系统自带软件(基本涵盖日常所需应用)

新年将近,由于当年安排的失误,系统盘(100G)和照片视频盘(4T)容量不够了,大容量的那块机械盘放在机箱里就在耳朵根吵吵,烦得很,于是狠狠心决定扩容后重配重装。 2023年最后…

JMeter 简单使用

JMeter 简介 Apache JMeter 是一款流行的性能测试工具,可以用来模拟用户行为并对系统进行压力测试。 安装 官方网站:http://jmeter.apache.org/ 在window下解压后, 运行 “bin/jmeter.bat” Jmeter 支持中文, 启动 Jmeter 后&…

【LMM 007】Video-LLaVA:通过投影前对齐以学习联合视觉表征的视频多模态大模型

论文标题:Video-LLaVA: Learning United Visual Representation by Alignment Before Projection 论文作者:Bin Lin, Yang Ye, Bin Zhu, Jiaxi Cui, Munan Ning, Peng Jin, Li Yuan 作者单位:Peking University, Peng Cheng Laboratory, Sun …