欧创新《DDD实战课》一颗阅读整理_欧创新的ddd-程序员宅基地

技术标签: 读后感  

本文是阅读《DDD实战课》一刻的读后整理原文(原文可到极客时间自行购买)

一基础篇:

DDD 的核心知识体系:

uploading.4e448015.gif正在上传…重新上传取消
 

2.DDD的设计思路:

   
1.战略设计主要从业务视角出发,建立业务领域模型,划分领域边界,建立通用语言的限界上下文,限界上下文可以作为微服务设计的参考边界。
 
2.战术设计则从技术视角出发,侧重于领域模型的技术实现,完成软件开发和落地,包括:聚合根、实体、值对象、领域服务、应用服务和资源库等代码逻辑的设计和实现
 

3.用三步来划定领域模型和微服务的边界:

  1.  一步: 在事件风暴中梳理业务过程中的用户操作、事件以及外部依赖关系等,根据这些要素梳理出领域实体等领域对象
  2. 第二步: 务紧密相关的实体进行组合形成聚合,同时确定聚合中的聚合根、值对象和实体
  3. 第三步: 根据业务及语义边界等因素,将一个或者多个聚合划定在一个限界上下文内,形成领域模型。在这个图根据领域实体之间的业务关联性,将业里,限界上下文之间的边界是第二层边界,这一层边界可能就是未来微服务的边界,不同限界上下文内的领域逻辑被隔离在不同的微服务实例中运行,物理上相互隔离
 
 

3.DDD 与微服务的关系:

 
DDD 主要关注:从业务领域视角划分领域边界,构建通用语言进行高效沟通,通过业务抽象,建立领域模型,维持业务和代码的逻辑一致性。
 
微服务主要关注:运行时的进程间通信、容错和故障隔离,实现去中心化数据管理和去中心化服务治理,关注微服务的独立开发、测试、构建和部署
 

4.核心域、支撑域和通用域

 
核心域:   决定产品和公司核心竞争力的子域是,它是业务成功的主要因素和公司的核心竞争力。
通用域:   没有太多个性化的诉求,同时被多个子域使用的通用功能子域是。
支撑域:   还有一种功能子域是必需的,但既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域,它就是支撑域
 

5.限定上下文:

 
  1. 通用语言确定了项目团队内部交流的统一语言,而这个语言所在的语义环境则是由限界上下文来限定的,以确保语义的唯一性。
  2. 而领域专家、架构师和开发人员的主要工作就是 通过事件风暴来划分限界上下文。限界上下文确定了微服务的设计和拆分方向,是微服务设计和拆分的主要依据。如果不考虑技术异构、团队沟通等其它外部因素,一个限界上下文理论上就可以设计为一个微服务。
 

6.实体和值对象:

 
  1. 实体和值对象的目的都是抽象聚合若干属性以简化设计和沟通,有了这一层抽象,我们在使用人员实体时,不会产生歧义,在引用地址值对象时,不用列举其全部属性,在同一个限界上下文中,大幅降低误解、缩小偏差,两者的区别如下:
  2. ①两者都经过属性聚类形成, 实体有唯一性,值对象没有。在本文案例的限界上下文中,人员有唯一性,一旦某个人员被系统纳入管理,它就被赋予了在事件、流程和操作中被唯一识别的能力,而值对象没有也不必具备唯一性。
  3. ②实体着重唯一性和延续性,不在意属性的变化,属性全变了,它还是原来那个它;值对象着重描述性,对属性的变化很敏感,属性变了,它就不是那个它了。
  4. ③战略上的思考框架稳定不变,战术上的模型设计却灵活多变,实体和值对象也有可能随着系统业务关注点的不同而更换位置。比如,如果换一个特殊的限界上下文,这个上下文更关注地址,而不那么关注与这个地址产生联系的人员,那么就应该把地址设计成实体,而把人员设计成值对象。
  5. 有些领域对象可以设计为值对象,也可以设计为实体,我们需要根据具体情况来分析。如果这个领域对象在其它聚合内维护生命周期,且在它依附的实体对象中只允许整体替换,我们就可以将它设计为值对象。如果这个对象是多条且需要基于它做查询统计,我建议将它设计为实体

7.如何设计一个聚合:

 
uploading.4e448015.gif正在上传…重新上传取消
 

8.聚合的设计原则:

  1. 聚合内的实体对象数据一致性,边界之外的数据和聚合内的互不影响,也就是说一个聚合内的数据是一起的
  2. 设计小聚合,大聚合会导致实体太多,高频操作导致事务大,并发等问题
  3. 聚合之间的关联通过聚合根ID进行关联
  4. 通过应用层进行领域编排或者通过事件机制

9.领域事件:

  为了多个聚合之间的交互方式:1.领域事件2通过应用层编排
    1.领域内的事件:通过本地事件表存储,通过eventbus发布事件
    2.领域外的事件:1.通过消息队列2.通过公共的事件库通信

二进阶篇:

1.传统MVC架构转基础的ddd架构(注意此处是最基础的ddd)

 

uploading.4e448015.gif转存失败重新上传取消

 

DDD 分层架构对三层架构的业务逻辑层进行了更清晰的划分,改善了三层架构核心业务逻

辑混乱,代码改动相互影响大的情况。DDD 分层架构将业务逻辑层的服务拆分到了应用层

和领域层。应用层快速响应前端的变化,领域层实现领域模型的能力。

另外一个重要的变化发生在数据访问层和基础层之间。三层架构数据访问采用 DAO 方式;

DDD 分层架构的数据库等基础资源访问,采用了仓储(Repository)设计模式,通过依赖

倒置实现各层对基础资源的解耦。

仓储又分为两部分:仓储接口和仓储实现。仓储接口放在领域层中,仓储实现放在基础层。

原来三层架构通用的第三方工具包、驱动、Common、Utility、Config 等通用的公共的资

源类统一放到了基础层

2.中台如何建模:

中台业务抽象的过程就是业务建模的过程,对应 DDD 的战略设计。系统抽象的过程就是微

服务的建设过程,对应 DDD 的战术设计。下面我们就结合 DDD 领域建模的方法,讲一下

中台业务建模的过程。

    第一步:按照业务流程(通常适用于核心域)或者功能属性、集合(通常适用于通用域或支

撑域),将业务域细分为多个中台,再根据功能属性或重要性归类到核心中台或通用中台。

核心中台设计时要考虑核心竞争力,通用中台要站在企业高度考虑共享和复用能力。

    第二步:选取中台,根据用例、业务场景或用户旅程完成事件风暴,找出实体、聚合和限界

上下文。依次进行领域分解,建立领域模型。

由于不同中台独立建模,某些领域对象或功能可能会重复出现在其它领域模型中,也有可能

本该是同一个聚合的领域对象或功能,却分散在其它的中台里,这样会导致领域模型不完整

或者业务不内聚。这里先不要着急,这一步我们只需要初步确定主领域模型就可以了,在第

三步中我们还会提炼并重组这些领域对象。

    第三步:以主领域模型为基础,扫描其它中台领域模型,检查并确定是否存在重复或者需要

重组的领域对象、功能,提炼并重构主领域模型,完成最终的领域模型设计。

第四步:选择其它主领域模型重复第三步,直到所有主领域模型完成比对和重构。

第五步:基于领域模型完成微服务设计,完成系统落地。

 

3.微服务代码结构(一种)

 

uploading.4e448015.gif正在上传…重新上传取消

 

4.应用层需要跨领域调用怎么办

各层之间通过接口调用

 

uploading.4e448015.gif转存失败重新上传取消

 

uploading.4e448015.gif转存失败重新上传取消

 

第一种是应用服务调用并组装领域服务。此时领域服务会组装实体和实体方法,实现核

心领域逻辑。领域服务通过仓储服务获取持久化数据对象,完成实体数据初始化。

第二种是应用服务直接调用仓储服务这种方式主要针对像缓存、文件等类型的基础层数据访问。这类数据主要是查询操作,没有太多的领域逻辑,不经过领域层,不涉及数据库持久化对象

 

 
 
 
 
 
 
 
 
 

 

 

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

智能推荐

网络办公自动化系统开发分析-程序员宅基地

文章浏览阅读235次。一、开发工具与技术的研究就现在开发OA的技术来说,主要集中分为三大类:基于C/S结构的应用程序开发,结合C/S结构和Web技术的复合应用程序,基于B/S结构的动态网页技术。以下将分析这三类技术的各自优缺点:C/S结构系统:是传统开发模式,一般以数据库和客户端的两层结构实现,也有加入中间件的三层或多层结构,在OA早期是标准的系统模式,但随着计算机技术的发展和网络的发展,它已..._办公自动化系统开发

取MySQL结果集的第一条记录-程序员宅基地

文章浏览阅读4.3w次。 在SQL Server数据库中,使用top关键字: SELECT TOP number|percent column_name(s) FROM table_name 在MySQL数据库中,使用LIMIT关键字: SELECT column_name(s) FROM table_name LIMIT number 例子:...

运放参数解释及常用运放选型-程序员宅基地

文章浏览阅读1.8k次。集成运放的参数较多,其中主要参数分为直流指标和交流指标,外加所有芯片都有极限参数。本文以NE5532为例,分别对各指标作简单解释。下面内容除了图片从NE5532数据手册上截取,其它内容都整理自网络。极限参数主要用于确定运放电源供电的设计(提供多少V电压、最大电流不能超过多少),NE5532的极限参数如下:直流指标运放主要直流指标有输入失调电压、输入失调电压的

opencv实现xld_QT+Halcon实现螺纹检测-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏2次。工业上要检测螺丝的内外直径、内外牙距、内外角度,现在比较好用的图像处理库,开源的opencv,收费的有halcon。为了实现螺纹检测,和对比螺纹检测拿个库比较好。分别用opencv和halcon实现了螺纹检测,通过对比发现用halcon实现的效果比较。现在用博客把实现过程记录下来:1、需要检测的螺纹数据如下: 2、为了实现检测螺丝以上数据,螺纹内径、螺纹外径、螺纹外牙距、螺纹内牙距、螺纹内角度和螺..._halcon螺纹检测

多线程 之 Join-程序员宅基地

文章浏览阅读113次。一个线程可以在其他线程上调用join()方法,效果是等待一段时间指导第二个线程结束才继续进行。如果某个线程在另一个线程t上调用t.join(),此线程被挂起,直到目标线程t结束才恢复,即t.isAlive()返回为false。也可以在join()上加一个时间参数,是一个等待的时间上线。此外 join方法可以被中断 在调用线程上调用interrupt()方法,thinking in java...

医疗大数据Topic推荐-AMiner-程序员宅基地

文章浏览阅读237次。AMiner平台(https://www.aminer.cn)由清华大学计算机系研发,拥有我国完全自主知识产权。平台包含了超过2.3亿学术论文/专利和1.36亿学者的科技图谱,提供学者评价、专家发现、智能指派、学术地图等科技情报专业化服务。系统2006年上线,吸引了全球220个国家/地区1000多万独立IP访问,数据下载量230万次,年度访问量超过1100万,成为学术搜索和社会网络挖掘研究的重要数据和实验平台。必读论文:https://www.aminer.cn/topic论文集地址:https:/.

随便推点

mysql 删除表中某一列的数据及删除某一列的方法_mysql删除某一列数据-程序员宅基地

文章浏览阅读1w次,点赞5次,收藏19次。表名 table_name 要操作的字段名 field_name 如果删除字段的值,可以将所有值清空: UPDATE table_name SET field_name = ''; 如果删除字段(这个字段从此就没有了): ALTER TABLE table_name DROP COLUMN field_name;..._mysql删除某一列数据

体素栅格对点云下采样(从基础写起)——源码解析C++_体素下采样的代码-程序员宅基地

文章浏览阅读3.5k次,点赞4次,收藏36次。一、前言所谓下采样是对点云的一种滤波,目的是减少点云数目由尽可能保持点云原有状态,从而减少计算量。所谓体素栅格是将点云空间划分为一个个极小的格子,格子里包含几个点。对体素栅格里面的点取平均或者加权平均,得到一个点,代替原来的几个点。显然,栅格选的越大,滤波后点云点数越少,速度快,但是会对原来的点云过度模糊;栅格选的越小,作用反之。二、代码实现输入点云pc,提前计算好点云的包围盒子(三..._体素下采样的代码

redirect_uri域名与后台配置不一致-程序员宅基地

文章浏览阅读3.2w次,点赞6次,收藏24次。1. 前言访问公众号网页提示: redirect_uri域名与后台配置不一致这个错误相信每个开发公众号的开发者都遇到过,本文记录详细配置步骤在工作中也有很多客户问我这个问题,也是为了避免重复沟通,到时候把这篇文章发给客户就可以了 -2. 配置网页授权域名详细步骤微信公众平台: https://mp.weixin.qq.com登录微信公众平台,在 设置与开发 -> 公众号设置 -> 功能设置 中找到 网页授权域名一个服务号最多只能配置两个网页授权域名,但是JS接口安全域名却最多_redirect_uri域名与后台配置不一致

linux下php安装mcrypt扩展-程序员宅基地

文章浏览阅读580次。以下步骤均为本人实际操作,可能与你的安装方法有所区别,但我会尽量排除疑惑)大致步骤(1)安装mcrypt,(2)安装php对mcrypt的扩展,(3)重启apache(1)、确认你的linux没有安装mcrypt库,如果已安装,跳过安装步骤[root@test-206~]#yumlistinstalled|grepmcryptlibmc..._libmcrypt-devel

最近做的一个博客的小例子(一)_博客例子-程序员宅基地

文章浏览阅读640次。这个博客的功能虽然挺少,但是使用起来还是对vue的理解有了一点的进步。这个小项目的技术栈为:vue,vue cli3,vue router,axios,fire base。编辑器是使用的vs code。首先先建立vue的脚手架,使用命令:vue create . 。在一个我创建好的目录之下建立脚手架。之后把脚手架中默认的内容去掉。首先我的博客的常规布局需要用到四个组件。1、顶部导航栏。..._博客例子

RNN LSTM GRU BRNN介绍_rnn & lstm & gru & brnn-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏9次。为什么我们需要序列模型?当你用前向神经网络或者CNN去处理序列模型的时候,表现的很差。我们常见的序列模型的例子:一段语音或者一句包含序列化单词的英语句子。前向传播或者CNN需要这些句子保持同样的额长度,但是我们都知道一句话里不同单词的长度都是不同的。如果你把这些语句变成同样的长度作为一个输入的话,这些传统的模型还是不能理解这些输入的含义。给定一段话,当观察某一个单词的时候你会发现,序列化模型都在..._rnn & lstm & gru & brnn