领域驱动设计DDD架构解析和绘图模板分享

  • DDD整洁架构

DDD整洁架构为了解决强调用的关系,出现了洋葱架构(六边形)架构,就是为了实现依赖倒置

它的思想就是把领域模型放到核心的位置,领域模型是独立的,不会直接强依赖其他层,而通过适配器来完成领域模型和外层的数据交换。

  • DDD分层架构和三层架构的区别与关系

DD分层架构和三层架构的区别与关系DDD代码分层架构与传统三层架构对比,可以发现传统三层架构被看成是一个贫血模式的领域驱动设计

  • DDD分层接口调用时序逻辑关系

DDD分层接口调用时序逻辑关系下面是基于DDD领域模型设计的系统中常用接口调用时序交互流程

  • CQRS架构

CQRS架构CQRS,中文名为命令和查询职责分离

CQRS 将系统中的操作分为两类,即「命令」(Command)  与「查询」(Query) 。命令则是对会引起数据发生变化操作的总称,即我们常说的新增,更新,删除这些操作,都是命令。而查询则和字面意思一样,即不会对数据产生变化的操作,只是按照某些条件查找数据。

CQRS 的核心思想是将这两类不同的操作进行分离,然后在两个独立的「服务」中实现。这里的「服务」一般是指两个独立部署的应用。在某些特殊情况下,也可以部署在同一个应用内的不同接口上。

Command 与 Query 对应的数据源也应该是互相独立的,即更新操作在一个数据源,而查询操作在另一个数据源上。当然查询和命令对应的数据源虽然不一样,但是肯定是需要同步的,那我们该怎么实现数据源的同步呢?

从图上可以看到,当 command 系统完成数据更新的操作后,会通过「领域事件」的方式通知 query 系统。query 系统在接受到事件之后更新自己的数据源。所有的查询操作都通过 query 系统暴露的接口完成。

从架构图上来看,CQRS 的实现似乎并不难,许多开发者觉得无非是「增删改」一套系统一个数据库,「查询」一个系统一个数据库而已,有点类似「读写分离」,并没有什么特别的地方。但是真正要使用 CQRS 是有许多问题与细节要解决的。

备注:以上架构图都使用PDDON在线画图工具免费制作,有需要要的朋友可以到官网上找到类似的架构图模板哦,免费克隆模板,根据自家业务克隆模板进行调整就可以使用了,工具和模板地址:http://pddon.com

本文转载于网络 如有侵权请联系删除

相关文章

  • 数据库(认识MySQL)

    MySQL是一个关系型的数据库管理系统,由MySQLAB公司开发,目前属于Oracle公司。MySQL体积较小、速度快、成本较低、开放源代码。同时支持跨平台。MySQL集群搭建及分库分表。MySQL特性MySQL使用C和C++编写,保证了源代码的可移植性;跨平台:支持主流的操作系统(Windows,Linux,Macos,HP-UX);对编程语言的支持,对多种编程语言提供了API(C,C++,JAVA,PYTHON,PHP,Perl,Ruby);支持多线程,充分利用CPU资源。(服务器单核(A,B);优化的SQL查询算法,能提高查询效率;提供了TCP/IP,ODBC和JDBC等多种数据库连接途径;支持多种存储引擎;提供了用于管理,检查,优化数据库操作的管理工具;MySQL服务端实用工具mysqldMysqld是MySQL的后台程序(进程),只有该程序运行后,客户端才可以连接访问数据库;mysqld_safe服务器的启动脚本。在Unix中使用mysqld_safe。mysql.server服务器启动脚本。是通过调用mysqld_safe来启动mysql服务器的。mysqld_multi服

  • Word中使用代码高亮插件

    一年前我写了一个word2010的代码高亮插件,但当时那个版本有一个问题:在用word发布博客的时候,高亮的代码在博客中的格式乱了。今天有空改了一下这个插件,虽然还是有些瑕疵,但至少发布到博客后,格式不会乱了。主要改进是用ol和li代替了pre,虽然发布到博客后,ol中设置的style和class依然会被改动,但可以在博客中用css来纠正。下载插件和源代码:SyntaxHighlighter4Word.zip下面说一下这个插件的用法。下载文件后,解压,然后双击bin\word2010\Kong.SyntaxHighlighter.Word2010.vsto或bin\word2007\Kong.SyntaxHighlighter.Word2007.vsto,即可完成安装,当然前提是你装了.netframework4.0。安装成功后的提示如下:安装插件后,会在word中多一个功能区(支持word2007和word2010):点击"设置"按钮,弹出设置界面:这里简化了配置,去掉了前一个版本中的一些设置。点击"插入代码"按钮,弹出如下界面:可以选择C#、

  • mariadb的一些特性(<=10.4)

    最近在看看MariaDB的官网上介绍MariaDB的功能和特性,大致罗列了本人觉得有必要了解下的几个地方:支持到列级别的压缩CREATE TABLE `cmp2` ( `id` bigint(20) NOT NULL, `name` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`)); https://mariadb.com/kb/en/library/storage-engine-independent-column-compression/复制支持sequence序列CREATE SEQUENCE s1 START WITH 50; SHOW CREATE SEQUENCE s1\G; *************************** 1. row ***************************        Table: t1 Create Table: CREATE SEQUENCE `s1` start with 50 minvalue 1 maxvalue 9223372036854775806 increment

  • TensorFlow 模型优化工具包:模型大小减半,精度几乎不变!

    近日,TensorFlow强势推出能将模型规模压缩却几乎不影响精度的半精度浮点量化(float16quantization)工具。小体积、高精度,还能够有效的改善CPU和硬件加速器延迟。TensorFlow发出相应的文章对该工具做了简要的说明,AI开发者将其整理编译如下。 Float16Quantization我们非常高兴能够将训练后的float16quantization作为模型优化工具包(ModelOptimizationToolkit)的一部分。这套工具包括了:混合量化(https://medium.com/tensorflow/introducing-the-model-optimization-toolkit-for-tensorflow-254aca1ba0a3)全整数量化(https://medium.com/tensorflow/tensorflow-model-optimization-toolkit-post-training-integer-quantization-b4964a1ea9ba)修剪(https://medium.com/tensorflow/ten

  • 使用Faster R-CNN、ResNet诊断皮肤病,深度学习再次超越人类专家

    选自IEEE作者:JeremyHsu机器之心编译由于在特征识别任务上具有优势,医疗图像诊断一直是人工智能技术应用的重要方向。近日,韩国研究人员应用深度学习算法在皮肤病诊断上击败了42位皮肤科专家,其研究发表在了Nature系列期刊的《InvestigativeofDermatology》上。据介绍,该工作使用了FasterR-CNN、ResNet等计算机视觉算法。目前,研究人员已将该方法制成安卓APP供人们使用(Googleplay下载链接见文中)。人工智能目前在与专业医生的能力对比上还罕有胜迹。但深度神经网络方法最近已经可以在灰指甲这一真菌疾病的诊断上击败42名皮肤科专家了——这种疾病每年困扰着3500万美国人。人工智能在医疗领域的这一巨大成功很大程度上得归功于韩国研究者提出的包含了50,000张手指甲与脚趾甲图片组成的庞大数据集。它可以用于训练深度神经网络识别灰指甲——一种可使指甲变色和变脆的常见真菌感染——为深度学习模型带来超越医学专家的强大优势。「这项研究首次展示了AI可以超越人类专家,」韩国首尔第一皮肤病医院的皮肤病医生和临床医生SeungSeogHan说。「目前为止,在很多

  • 小白博客 Linux安装JDK详细步骤

    Linux安装JDK步骤 1.先从网上下载jdk(jdk-1_5_0_02-linux-i586.rpm),推荐SUN的官方网站www.sun.com,下载后放在/home目录中,当然其它地方也行。 进入安装目录 #cd/home #cpjdk-1_5_0_02-linux-i586.rpm/usr/local #cd/usr/local 给所有用户添加可执行的权限 #chmod+xjdk-1_5_0_02-linux-i586.rpm.bin #./jdk-1_5_0_02-linux-i586.rpm.bin 此时会生成文件jdk-1_5_0_02-linux-i586.rpm,同样给所有用户添加可执行的权限 #chmod+xjdk-1_5_0_02-linux-i586.rpm 安装程序 #rpm-ivhjdk-1_5_0_02-linux-i586.rpm 出现安装协议等,按接受即可。 2.设置环境变量。 #vi/etc/profile 在最后面加入 #setjavaenvironment JAVA_HOME=/usr/java/jdk-1_5_0_02 CLASSPATH=.

  • Python入门教程之安装MyEclipse插件和安装Python环境

    PyPythonforWindows安装文件安装好所需要的文件。即可在MyEclipse里面开始Python最简单的测试了。首先选择Python的编译器 在MyEclipseWindows-preferences     New 输入名称选择编译器 选择所有的确认OK 等待一下安装 完毕之后就可以开始创建Python工程测试了选择project选择PydevProject下一步 选择个语法版本2.5 对工程src-NEW-PyDevModule 新建的后缀名为 .py 自动会切换到PyDevperspective这个视图下可以更好的编辑。helloworld 代码就一行 比java的少了很多。 简单的安装和Python代码运行测试就是这样。很简单。都不需要duangduangduang的。简单的基础运用代码  可以自己试试一下哦。    2015-03-03Python基础知识''' @author: 小帅丶 @todo: Python安装使用第一步 Created on 2015-03-03 ''' #coding=utf

  • 量子计算开启云计算通往新世界的大门

    随着数据的海量增长,机器处理数据所需的时间也越来越多。增强现实、虚拟现实、人工智能、机器人、实时分析和机器学习算法都需要云计算提供无限快速且无限计算能力和无穷大的存储空间。有趣的是,这些都是在摩尔定律显示的发展速度放缓之后发生的,摩尔定律在几十年来几乎每个工程和技术的重大进步中发挥了作用。到2025年,云对传统计算功能的需求将会非常大,以至于云计算无法满足这些计算需求。量子计算的到来有望彻底改变云计算,量子计算提供的是大规模并行处理,原子级存储和试用物理定律而不是外部加密的安全性。云很快会被量子计算驱动,软件将会以全新的方式被写入。虽然量子计算的概念已经提出了50多年,但是真正取得进步却是在最近5年以内,2017年可以说是量子计算的一年。IBM、微软、谷歌、Intel、D-Wave今年取得了巨大的进步,量子计算正在进一步推动计算机性能的发展。什么是量子计算量子计算就是利亚原子例子的量子态来执行记忆和处理任务,经典的计算机交换晶体管将信息编码为表示“0”或“1”的单位。相比之下,量子计算机本身使用原子(如电子、质子和光子)的基本构建模块,这些亚原子例子是自旋的。根据量子物理的定律,粒子是

  • 树莓派:文本编辑器与文件

    作者:Vamei出处:http://www.cnblogs.com/vamei严禁转载。   GNUnano是Unix系统下一款常用的文本编辑器,以简单易用著称。与之相比,功能更强大的Vi和Emacs编辑器,学习曲线比nano陡峭很多。由于nano对于一般的文本编辑来说已经足够,所以我想简单介绍一下,以便于更好入门。   基本使用 在Shell中输入下面命令,就可以启动nano: nanotest.txt复制 命令nano后面跟着想要修改的文件名。如果当前文件夹下存在名为test.txt的文件时,改命令将打开这个文件。否则,nano会创建一个新文件。随后,Shell会进入到nano的编辑界面。nano的编辑方式和常用的记事本工具类似,都是“所见即所得”。用上下左右键,就可以把光标移动到想要编辑的位置,然后输入或删除即可。   完成之后,你可以按Ctrl+O键来保存文件。nano询问你是否保存缓存中的修改: p.p1{margin:0;font:13pxMenlo;color:rgba(255,255,255,1);background-color:rg

  • System.Net.ConnectStream 转换为 MemoryStream 内存流

    项目经理来了一份奇特要求: 在asp.net2.0webfrom的老项目页面上去调用.net4.0的webapi接口去下载Excel哈哈脑洞大开 非常迅速的创建了一个接口返回Excel转换的数据流代码如下: [HttpPost] publicHttpResponseMessageExportQuoteReport(ExportQuoteCountModelsearchModel) { try { List<string>listtitle=newList<string>(){"群(","本部","事业部","实施","资源","名称","项目编号", "项目名称","客户","状态","TS天数","正常报天数","0天数","无天数","负责人编号","负责人"}; varlist=ReportService.GetQuoteReportForExcel(searchModel); IWorkbookbook=newXSSFWorkbook(); ISheetsheet=book.CreateSheet("Sheet1"); IRowrowTitle=sh

  • jsp 学习 第3步 - el 自定义方法 tld 说明

      使用el的过程中,需要使用到后端代码处理逻辑,这个时候我们就需要自定义方法。 如我们后端代码定义如下: packagecom.rhythmk.common; publicclassFncHelper{ publicstaticStringgetBlog() { return"Rhythmk.cnblogs.com"; } publicstaticIntegergetResult(Integerx,Integery){ returnx+y; } }复制   在/WebContent/WEB-INF目录下我们新建tlds用于存放自定义方法   如新建文件 fuc于路径 /WebContent/WEB-INF/fnc.tld代码如下: <?xmlversion="1.0"encoding="UTF-8"?> <taglibxmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-

  • es-基础

    ES学习笔记-基础篇 目录ES学习笔记-基础篇ES简介什么是数据相关度?搜索引擎Lucene倒排索引倒排索引的数据结构倒排表压缩算法FOR(FrameofReference)算法RBM(RoaringBitmap)算法两个算法如何选择索引压缩算法FTSElasticsearchES安装单节点安装Kibana安装elasticsearch集群安装elasticsearch-head插件安装索引基本使用索引的概念新增查询修改mappingmapping的数据类型两种映射方式搜索和查询查询上下文相关度评分:_score元数据:_source常用查询语法分词器normalization分词器的构成字符过滤器(char_filter)令牌过滤器(token_filter)分词器自定义分词器ik分词器安装ik分词器的配置文件自定义词库自定义词库热更新聚合查询语法分类桶聚合指标聚合嵌套聚合管道聚合聚合和查询的关系聚合排序常用查询函数histogram:直方图或柱状图统计date-histogram:基于日期的直方图,比如统计一年每个月的销售额percentile百分位统计或者饼状图脚本查询支持的语言

  • Semantic UI Message消息窗口关闭

    引入SemanticUI框架: <scriptsrc="https://cdn.jsdelivr.net/npm/jquery@3.2/dist/jquery.min.js"></script> <scriptsrc="https://cdn.jsdelivr.net/semantic-ui/2.2.4/semantic.min.js"></script> 复制 HTML: <divclass="uimessage"> <iclass="closeicon"></i> <divclass="header"> Welcomeback! </div> <p>Thisisaspecialnotificationwhichyoucandismissifyou'reboredwithit.</p> </div> 复制 js有两种写法: 方法1: $('.message.close') .on('click',function(){ $(this)

  • 保护那朵最敏感的“花”

    保护那朵最敏感的“花” 丁零零,上课的铃声落定。一个个稚嫩的脸庞眼睛盯着讲台上的我,如同一排排雨后的春笋般精神抖擞。一眼望去,却看到了一个空的位置。人呢? 我的心里十分疑惑。走进那个空的位置,我低头询问:“小方人呢?”这个孩子想来并非磨磨蹭蹭的,此时干嘛去了?我的话音刚落,教室里顿时响起了一阵嬉笑的声音夹杂着窃窃私语。一个胆大的孩子站起来大声说道:“小方尿裤子了,去找老师换裤子了。”我心下了然这笑声从何而来。在这群二年级的孩子心中,尿裤子一件可笑而没面子的事情。我的脑海中浮现出小方的脸,因为家庭的缘故,这个男孩虽看起来开朗,其实内心敏感,若他等会回教室,还看到戏谑的表情,听到取笑的声音,他的内心该有多么难过,这朵敏感的“花”是否会因此而垂头?教室里窃窃私语,孩子们都在从老师的表情中等待着我的反应。此时,讲大道理或许也没什么作用。我想了想,微笑着对大家说:“我们来玩个游戏好吗?等会小方进来,谁都不看他,也不发出任何声音,以后也不跟他提这件事,能完成这个挑战的孩子举手?”一双双小手争先恐后地举了起来。教室安静了下来,孩子们开始认真听课。过了一会,一声“报告”在教室门口响起,小方出现在教室门

  • windows下设置PHP环境变量

    1.找到“高级系统设置”(二选一的方法找到环境变量) ① 我的电脑-属性-高级-环境变量 ②win8,10直接在搜索框搜“查看高级系统设置”-环境变量   2.找到变量"Path" (win10用②) ①在原来的后边加上“;D:/xammp/php”(php.exe所在的目录,前边还有个;) ②或者是按新建加上 “D:/xammp/php”    3.重新打开cmd  win+R,输入php-v(查看php版本信息)   4.成功!

  • 二分匹配算法

    过山车TimeLimit:1000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)TotalSubmission(s):30AcceptedSubmission(s):7 ProblemDescriptionRPGgirls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗? Input输入数据的第一行是三个整数K,M,N,分别表示可能的组合数目,女生的人数,男生的人数。0<K<=10001<=N和M<=5

  • Vue和 MVVM 的小细节

    MVVM是Model-View-ViewModel的缩写,它是一种基于前端开发的架构模式,其核心是提供对View和ViewModel的双向数据绑定,这使得ViewModel的状态改变可以自动传递给View,这就是所谓的数据双向绑定。 Vue.js是一个提供MVVM风格的双向数据绑定的Javascript库,专注于View层。它的核心是MVVM中的VM,也就是ViewModel。ViewModel负责连接View和Model,保证视图和数据的一致性,这种轻量级的架构让前端开发更加高效、便捷。   为什么会出现MVVM呢? 可以说2015年是MVVM最火热的一年,而Java中的经典的 SSH框架就用来构建一个标准的MVC架构。一直到接触Vue.js之后,研究了MVVM架构思想,然后再回头看MVC,才有一种豁然开朗的感觉~ MVC即Model-View-Controller的缩写,就是 模型-视图-控制器 ,也就是说一个标准的Web应用程式是由这三部分组成的:  View用来把数据以某种方式呈现给用户 Model其实就是数据 Co

  • vue组件通信新姿势

    在vue项目实际开发中我们经常会使用props和emit来进行子父组件的传值通信,父组件向子组件传递数据是通过prop传递的, 子组件传递数据给父组件是通过$emit触发事件来做到的。例如: Vue.component('child',{ data(){ return{ mymessage:this.message } }, template:` <div> <inputtype="text"v-model="mymessage"@input="passData(mymessage)"></div> `, props:['message'],//得到父组件传递过来的数据 methods:{ passData(val){ //触发父组件中的事件 this.$emit('getChildData',val) } } }) Vue.component('parent',{ template:` <div> <p>thisisparentcompoent!</p> <child:message="message"v

  • c语言数据处理!

       #include"stdio.h" struct { charname[10]; longnume; charsex[6]}; charlive[30]; floatscore; }stur; main() { printf("请输入您的名字和学号:\n"); scanf("%s%ld",stur.name,&stur.nume); printf("%s\n%ld",stur.name,stur.nume); }复制   doublekai.com

  • hbase配置项介绍

    hbase-site.xml配置参数介绍 hbase.rootdir 这个目录是regionserver的共享目录,用来持久化HBase。URL需要是'完全正确'的,还要包含文件系统的scheme。例如,要表示hdfs中的'/hbase'目录,namenode运行在namenode.example.org的9090端口。则需要设置为hdfs://namenode.example.org:9000/hbase。默认情况下HBase是写到/tmp的。不改这个配置,数据会在重启的时候丢失。默认: file:///tmp/hbase-${user.name}/hbase hbase.master.port HBase的Master的端口. 默认: 60000 hbase.cluster.distributed HBase的运行模式。false是单机模式,true是分布式模式。若为false,HBase和Zookeeper会运行在同一个JVM里面。 默认: false hbase.rpc.engine HBase使用的

  • 学习进度笔记25

    《机器学习十讲》第十讲强化学习 一、马尔可夫决策过程MDP     二、基于价值的方法  Q-Learning DQN 三、基于策略的方法 策略梯度算法 四、总结 机器学习——》微积分、概率论、优化方法、统计学        ——》python、数据结构、数据库 数据采集、数据管理、数据清洗、数据可视化 深度学习、强化学习 NLP、网络分析。。。。。 与相应行业结合    学习建议

相关推荐

推荐阅读