浮浮沉沉 - DDD

现在谈到微服务,大多会提到DDD, 这两者之间有什么关系呢?让我在这篇文章里揭秘吧.

  • DDD是什么?
  • DDD设计的一些原则?
  • 如何基于DDD实现一个服务?
  • DDD的反面是什么?

DDD 是什么?


DDD(Domain Driven Design)是一种设计方法论,它提供了一种拆解知识和问题的方式.

DDD的背景

2004年Eric Evans 出版了《领域驱动设计》。微服务发迹于2014年。但这10年间DDD可以说是默默无闻,就好像一个妃子被打入冷宫一样,直到微服务出现,两者才喜结良缘,很难说谁成就了谁,两者是如此的契合.

DDD的核心概念

DDD有将近10个左右的概念。这些概念都是为了搞清楚一件事:业务的边界是什么?什么样的东西应该放在这个业务里?什么样的东西不应该放在这个业务里?

人世间的争论大多数是名词之争。以前看《李敖有话说》,李敖提到了这样一个故事

我想起《展望》(The Outlook)总编辑艾勃特(Lyman Abbott)自传中记他父亲的谈话:“自古以来,凡在哲学上和神学上的争论,十分之九都是名词之争。”艾勃特接着说:“我父亲的话是对的。但我年纪愈大,愈感到他老人家的算术还有点儿小错。——剩下的那十分之一,其实也是名词之争。”

一个人叫张三,无论它到世界任何角落,他还是张三,这是“实”。在公司里,张三是员工。在家里张三是父亲,父亲和员工是“形”;
一瓶酒在仓库里叫库存,在运输的过程中叫货物。

知识也是类似的。知识可以有不同的分类,可以按照规模大小来分,也可以按照重点和非重点分(二八法则),所以大概有四种类型:

  • 总的知识
  • 细分的知识
  • 重点知识
  • 非重点知识。

但不管是哪种知识,都属于知识,具有知识的共性:知识表达了一系列的事实,行为,最核心的组成成分是名词和动词。所以一系列的的名词和动词构成了一个完整的知识.

  • 领域 - 总的知识
  • 子域 - 细分的知识
  • 核心域 - 重点知识
  • 支撑域 - 非重点知识
  • 通用域 - 非重点知识
  • 聚合 - 一系列名词和动词的集合。
  • 聚合根 - 一系列名词和动词的集合,就像一个组织一样,得有一个老大负责对内对外的沟通.
  • 实体 - 名词 + 动词,是一种充血模型,以DO的的形式存在.
  • 值对象 - 名词

DDD设计的一些原则?

  • 应用层实现跨聚合的调用。
  • 聚合之间的逻辑满足最终一致性。
  • 领域层实现跨实体的调用
  • 聚合内的逻辑满足强一致性
  • 要访问聚合,先找到聚合根

如何基于DDD实现一个服务?

形成DDD的过程

* 收集信息
  * 项目负责人收集尽可能多的信息
  * 召集大家一起开会,分析一个领域内有多少User case
* 形成领域模型
  * 对所有的User case进行名词提取,汇总出有多少核心名词
  * 提取这些名词的核心行为
* 实现
  * 基于上面的名词设计实体和值对象

一个简单的DDD例子

DDD的反面是什么?