浮浮沉沉 - 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进行名词提取,汇总出有多少核心名词
* 提取这些名词的核心行为
* 实现
* 基于上面的名词设计实体和值对象