要想应用 DDD,首要任务就是要吃透 DDD 的核心设计思想,搞清楚 DDD、微服务和中台之间的关系。中台本质是业务模型,微服务是业务模型的系统落地,DDD 是一种设计思想,它可以同时指导中台业务建模和微服务设计,它们之间就是这样的一个铁三角关系。DDD 强调领域模型和微服务设计的一体性,先有领域模型然后才有微服务,而不是脱离领域模型来谈微服务设计。

如何通过领域事件实现微服务解耦?

怎样进行微服务分层设计?

如何实现层与层之间的服务协作?

通过几种微服务架构模型的对比分析,让你了解领域模型和微服务分层的作用和价值。

介绍中台设计的核心思想,和你探讨如何实现前中后台的协同和融合?

如何利用 DDD 进行中台设计?

中台和领域建模的实战:带你了解如何用 DDD 设计思想构建企业级可复用的中台业务模型,了解事件风暴以及用事件风暴构建领域模型的过程。

微服务设计实战:带你了解如何用 DDD 设计微服务代码模型,如何从领域模型完成微服务设计,建立领域模型与微服务代码模型的映射关系,如何完成微服务的架构演进等

DDD 的知识体系提出了很多的名词,像:领域、子域、核心域、通用域、支撑域、限界上下文、聚合、聚合根、实体、值对象等等

领域建模和微服务建设的过程和方法基本类似,其核心思想就是将问题域逐步分解,降低业务理解和系统实现的复杂度。

如何理解核心域、通用域和支撑域?在领域不断划分的过程中,领域会细分为不同的子域,子域可以根据自身重要性和功能属性划分为三类子域,它们分别是:核心域、通用域和支撑域。决定产品和公司核心竞争力的子域是核心域,它是业务成功的主要因素和公司的核心竞争力。没有太多个性化的诉求,同时被多个子域使用的通用功能子域是通用域。还有一种功能子域是必需的,但既不包含决定产品和公司核心竞争力的功能,也不包含通用功能的子域,它就是支撑域。这三类子域相较之下,核心域是最重要的,我们下面讲目的的时候还会以核心域为例详细介绍。通用域和支撑域如果对应到企业系统,举例来说的话,通用域则是你需要用到的通用系统,比如认证、权限等等,这类应用很容易买到,没有企业特点限制,不需要做太多的定制化。而支撑域则具有企业特性,但不具有通用性,例如数据代码类的数据字典等系统。

比如同样都是电商平台的淘宝、天猫、京东和苏宁易购,他们的商业模式是不同的。

淘宝是 C2C 网站,个人卖家对个人买家,而天猫、京东和苏宁易购则是 B2C 网站,是公司卖家对个人买家。即便是苏宁易购与京东都是 B2C 的模式,他们的商业模式也是不一样的,苏宁易购是典型的传统线下卖场转型成为电商,京东则是直营加部分平台模式。

商业模式的不同会导致核心域划分结果的不同。有的公司核心域可能在客户服务,有的可能在产品质量,有的可能在物流。在公司领域细分、建立领域模型和系统建设时,我们就要结合公司战略重点和商业模式,找到核心域了,且重点关注核心域。

如果你的公司刚好有意向转型微服务架构的话,我建议你和你的技术团队要将核心域的建设排在首位,最好是有绝对的掌控能力和自主研发能力,如果资源实在有限的话,可以在支撑域或者通用域上想想办法,暂时采用外购的方式也未尝不可。

领域的核心思想就是将问题域逐级细分,来降低业务理解和系统实现的复杂度。

通过领域细分,逐步缩小微服务需要解决的问题域,构建合适的领域模型,而领域模型映射成系统就是微服务了。

核心域、支撑域和通用域的主要目标是:通过领域划分,区分不同子域在公司内的不同功能属性和重要性,从而公司可对不同子域采取不同的资源投入和建设策略,其关注度也会不一样。

1. 在一致性边界内建模真正的不变条件。聚合用来封装真正的不变性,而不是简单地将对象组合在一起。聚合内有一套不变的业务规则,各实体和值对象按照统一的业务规则运行,实现对象数据的一致性,边界之外的任何东西都与该聚合无关,这就是聚合能实现业务高内聚的原因。

2. 设计小聚合。如果聚合设计得过大,聚合会因为包含过多的实体,导致实体之间的管理过于复杂,高频操作时会出现并发冲突或者数据库锁,最终导致系统可用性变差。而小聚合设计则可以降低由于业务过大导致聚合重构的可能性,让领域模型更能适应业务的变化。

3. 通过唯一标识引用其它聚合。聚合之间是通过关联外部聚合根 ID 的方式引用,而不是直接对象引用的方式。外部聚合的对象放在聚合边界内管理,容易导致聚合的边界不清晰,也会增加聚合之间的耦合度。

4. 在边界之外使用最终一致性。聚合内数据强一致性,而聚合之间数据最终一致性。在一次事务中,最多只能更改一个聚合的状态。如果一次业务操作涉及多个聚合状态的更改,应采用领域事件的方式异步修改相关的聚合,实现聚合之间的解耦(相关内容我会在领域事件部分详解)。

5. 通过应用层实现跨聚合的服务调用。为实现微服务内聚合之间的解耦,以及未来以聚合为单位的微服务组合和拆分,应避免跨聚合的领域服务调用和跨聚合的数据库表关联。上面的这些原则是 DDD 的一些通用的设计原则,还是那句话:“适合自己的才是最好的。”在系统设计过程时,你一定要考虑项目的具体情况,如果面临使用的便利性、高性能要求、技术能力缺失和全局事务管理等影响因素,这些原则也并不是不能突破的,总之一切以解决实际问题为出发点。

聚合的特点:高内聚、低耦合,它是领域模型中最底层的边界,可以作为拆分微服务的最小单位,但我不建议你对微服务过度拆分。但在对性能有极致要求的场景中,聚合可以独立作为一个微服务,以满足版本的高频发布和极致的弹性伸缩能力。

一个微服务可以包含多个聚合,聚合之间的边界是微服务内天然的逻辑边界。有了这个逻辑边界,在微服务架构演进时就可以以聚合为单位进行拆分和组合了,微服务的架构演进也就不再是一件难事了。

聚合根的特点:聚合根是实体,有实体的特点,具有全局唯一标识,有独立的生命周期。一个聚合只有一个聚合根,聚合根在聚合内对实体和值对象采用直接对象引用的方式进行组织和协调,聚合根与聚合根之间通过 ID 关联的方式实现聚合之间的协同。

实体的特点:有 ID 标识,通过 ID 判断相等性,ID 在聚合内唯一即可。状态可变,它依附于聚合根,其生命周期由聚合根管理。实体一般会持久化,但与数据库持久化对象不一定是一对一的关系。

实体可以引用聚合内的聚合根、实体和值对象。值对象的特点:无 ID,不可变,无生命周期,用完即扔。值对象之间通过属性值判断相等性。它的核心本质是值,是一组概念完整的属性组成的集合,用于描述实体的状态和特征。值对象尽量只引用值对象。

DDD基础篇学习总结相关推荐

  1. 鸟叔linux私房菜基础篇简体,鸟叔的Linux私房菜基础篇-学习笔记(一)

    鸟叔的Linux私房菜基础篇-学习笔记(一) 开机进入命令行模式: ctrl+alt+[F1-F6]的任意键进入命令行编辑界面 ctrl+alt+F7进入图形界面模式 开始下达指令 [dmtsai@s ...

  2. 数学物理方法·基础篇-学习主要内容

    数学物理方法·基础篇-学习主要内容 QQ:3020889729 小蔡 数学物理方法·发展 学习体系结构 学习的应用思路 参考书目: QQ:3020889729 小蔡 数学物理方法·发展 学习体系结构 ...

  3. Java基础篇 学习笔记

    List item Java基础篇 学习笔记 java基础篇 第1章 计算机.程序和java概述 学习笔记 1.1什么是计算机 简单来说:计算机就是 ' 存储 ' 和 ' 处理 ' 数据的电子设备. ...

  4. Linux随笔-鸟哥Linux基础篇学习总结(全)

    Linux随笔-鸟哥Linux基础篇学习总结(全) 修改Linux系统语系:LANG-en_US,如果我们想让系统默认的语系变成英文的话我们可以修改系统配置文件:/etc/sysconfig/i18n ...

  5. Python基础篇学习

    本篇博文目录: 一.Python基础语法 1.Python基础知识 2.了解Python的基础语法结构 3.python基础知识 二.数据类型 1.数字 2.字符串 3.布尔 4.空值:None 5. ...

  6. 狂神说java java基础篇 学习笔记

    java基础的视频内容笔记都在这了 前言等字数非常长的章节,使用了AI语音识别成文字后修改的,有错漏欢迎提出 面对对象模块的按照自己的理解进行了内容修改,可以对比原视频内容理解,如有建议欢迎提出 前言 ...

  7. Python基础篇学习感悟:学如不及,犹恐失之

    从2019年3月底开始学习Python,4月12日在CSDN发表第一篇博文,时至今日已有4个月零12天. 4个多月的学习,老猿从一个Python小白成长到今天,可以说对Python这门语言已经略知一二 ...

  8. C++语言基础篇学习总结及心得体会(难度极低)

    关于C++的语言部分(信息学奥赛一本通),我自己总结了一部分的知识. 因为过于基础,第一部分源代码的简介和使用我就不讲了. 我直接从第二章顺序结构程序设计开始讲.首先,我认为在这一章内只要理解一个因果 ...

  9. attrib批量显示文件夹_1.2Windows之DOS命令基础篇-学习attrib+del+copy+xcopy命令

    学习要点: 1.设置文件属性:attrib 2.删除命令:del 3.复制文件:copy 4.复制文件(夹):xcopy --------------------------------------- ...

最新文章

  1. HbuilderX中的git的使用 git HbuilderXgit HbuilderX 使用git
  2. 你的sql查询为什么这么慢?
  3. delphi批量存入多媒体字段 遇到内存溢出的坑
  4. 获取页面和滚动条高度的另一种方法
  5. Nginx卡在登录页面不断跳转如何解决?(登不进登录页面)ip_hash机制(还是没解决)
  6. 服务行为 之 并发与实例化
  7. python qt信号在qml 的使用_Python和C++混合使用QML开发GUI
  8. webstorm2017.1.3破解教程
  9. c语言include iostream,求助,虚拟机上#includeiostream一直报错
  10. 推荐几款好用的压缩软件
  11. pdf文件如何生成目录 wps_WPS文档如何生成目录你会了吗?
  12. android usb micro,朝夕相伴不知芳名? 来补补USB接口知识
  13. 【最新】滤器完整性检测各国规定
  14. 会员权益营销中,等级会员的五种权益设置
  15. PDF预览完整解决方案及各种兼容(VUE版)
  16. javascript的回调函数
  17. 程序框图计算机算法语言应用,第3讲 程序框图与算法语句
  18. c语言规定对于一个正常运行的c程序,下列叙述中正确的是,对于一个正常运行的C语言程序,以下叙述中正确的是()。A.程序的执行总是从main函数开始,在main函...
  19. MAP 推荐系统 Mean Average Precision
  20. C++new和delete实现原理

热门文章

  1. TimeSpan值属性与方法 定时器
  2. AAC格式音频的结构分析
  3. [最小割]狼和羊的故事
  4. 论“文艺青年”都是“娇情逼”
  5. 名帖375 祝允明 草书《云江记》
  6. java审批流程框架_基于SSM框架下的JAVA企业流程审批系统
  7. 快速学会corn表达式
  8. BZOJ4143 [AMPPZ2014]The Lawyer
  9. Vue的传值方式(二)——双向数据绑定【v-model】
  10. 虚拟化之路一:虚拟化概述