Spiga

标签为DDD的文章

领域驱动开发分享

2018-09-14 18:39:56

摘要:前言 微服务已经成为目前开发的主流设计,我们也要与时俱进不能一直还停留在三层架构的思想层面。年前也更大家简单介绍过什么是微服务,以及实现微服务中需要用到的一些相关技术。之前一直停留在工具和代码阶段,那具体应该如何设计如何落地呢?微服务设计过程中往往会面临边界如何划定的问题,微服务到底应该拆多小,不同的人会根据自己对微服务的理解而拆分出不同的微服务,如何我们还是不经过设计,只是靠拍脑袋硬完成开发的话,上线后运维的压力将会远大于单体程序。那是否有合适的理论或设计方法来指导微服务设计呢?答案就是DDD。微服务拆分困境产生的根本原因就是不知道业务或者微服务的边界到底在什么地方。换句话说,确定了业务边界和应用边界,这个困境也就迎刃而解了. 2004 年埃里克·埃文斯(Eric Evans)发表了《领域驱动设计》(Domain-Driven Design –Tackling Complexity in the Heart of Software)这本书,从此领域驱动设计(Domain Driven Design,简称 DDD)诞生。DDD 核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。但 DDD 提出后在软件开发领域一直都是“雷声大,雨点小”!直到 Martin Fowler 提出微服务架构,DDD 才真正迎来了自己的时代。利用 DDD 设计方法来建立领域模型,划分领域边界,再根据这些领域边界从业务视角来划分微服务边界。而按照 DDD 方法设计出的微服务的业务和应用边界都非常合理,可以很好地实现微服务内部和外部的“高内聚、低耦合”。于是越来越多的人开始把 DDD 作为微服务设计的指导思想。现在,很多大型互联网企业已经将 DDD 设计方法作为微服务的主流设计方法了。DDD 也从过去“雷声大,雨点小”,开始真正火爆起来。 DDD知识体系 领域 领域不断划分的过程中,领域会细分为不同的子域,子域可以根据自身重要性和功能属性划分为三类子域,它们分别是:核心域、通用域和支撑域。 核心域:系统最核心并有复杂业务逻辑的业务界限上下文,比如OA系统的物资管理。 支撑域:系统支撑其他界限上下文的基础,比如OA系统的员工基础资料。 通用域:需要使用的基础框架或第三方成熟解决方案,比如OA系统工作流引擎。 工作流引擎是个比较大的领域,目前我们…… 阅读全文

DDD(八):微服务架构模型

2016-01-06 21:45:35

摘要:前面介绍了 DDD 分层架构,同时也提到了微服务架构模型其实还有好多种,不知道你注意到了没?这些架构模型在我们的实际应用中都具有很高的借鉴价值。 那么今天我们就把 DDD 分层架构、整洁架构、六边形架构这三种架构模型放到一起,对比分析,看看如何利用好它们,帮助我们设计出高内聚低耦合的中台以及微服务架构。 整洁架构 整洁架构又名“洋葱架构”。为什么叫它洋葱架构?看看下面这张图你就明白了。整洁架构... 阅读全文

DDD(七):分层架构

2015-12-30 11:51:54

摘要:前面我们讲了 DDD 的一些重要概念以及领域模型的设计理念。今天我们来聊聊“DDD 分层架构”。微服务架构模型有好多种,例如整洁架构、CQRS 和六边形架构等等。每种架构模式虽然提出的时代和背景不同,但其核心理念都是为了设计出“高内聚低耦合”的架构,轻松实现架构演进。而 DDD 分层架构的出现,使架构边界变得越来越清晰,它在微服务架构模型中,占有非常重要的位置。那 DDD 分层架构到底长什么样?DDD 分层架构如何推动架构演进?我们该怎么转向 DDD 分层架构?这就是我们这一讲重点要解决的问题。 阅读全文

DDD(六):领域事件

2015-12-18 21:02:38

摘要:在事件风暴(EventStorming)时,我们发现除了命令和操作等业务行为以外,还有一种非常重要的事件,这种事件发生后通常会导致进一步的业务操作,在 DDD中这种事件被称为领域事件。这只是最简单的定义,并不能让我们真正理解它。那到底什么是领域事件?领域事件的技术实现机制是怎样的?今天,我们就重点解决这两个大的问题。 领域事件 领域事件是领域模型中非常重要的一部分,用来表示领域中发生的事件。一... 阅读全文

DDD(五):聚合和聚合根

2015-12-09 11:40:49

摘要:我们先回顾下上一讲,在事件风暴中,我们会根据一些业务操作和行为找出实体(Entity)或值对象(ValueObject),进而将业务关联紧密的实体和值对象进行组合,构成聚合,再根据业务语义将多个聚合划定到同一个限界上下文(BoundedContext)中,并在限界上下文内完成领域建模。 那你知道为什么要在限界上下文和实体之间增加聚合和聚合根这两个概念吗?它们的作用是什么?怎么设计聚合?这就是我... 阅读全文

DDD(四):实体和值对象

2015-11-26 22:26:30

摘要:这两个概念都是领域模型中的领域对象。它们在领域模型中起什么作用,战术设计时如何将它们映射到代码和数据模型中去?就是我们这一讲重点要关注的问题。 另外,在战略设计向战术设计过渡的这个过程中,理解和区分实体和值对象在不同阶段的形态是很重要的,毕竟阶段不同,它们的形态也会发生变化,这与我们的设计和代码实现密切相关。 接下来,我们就分别看看实体和值对象的这些问题,从中找找答案。 实体 我们先来看一下实... 阅读全文

DDD(三):限界上下文

2015-11-13 18:42:05

摘要:在 DDD领域建模和系统建设过程中,有很多的参与者,包括领域专家、产品经理、项目经理、架构师、开发经理和测试经理等。对同样的领域知识,不同的参与角色可能会有不同的理解,那大家交流起来就会有障碍,怎么办呢?因此,在DDD中就出现了“通用语言”和“限界上下文”这两个重要的概念。 这两者相辅相成,通用语言定义上下文含义,限界上下文则定义领域边界,以确保每个上下文含义在它特定的边界内都具有唯一的含义,... 阅读全文

DDD(二):领域、子域、核心域、通用域和支撑域

2015-11-05 18:53:15

摘要:DDD的知识体系提出了很多的名词,像:领域、子域、核心域、通用域、支撑域、限界上下文、聚合、聚合根、实体、值对象等等,非常多。这些名词,都是关键概念,但它们实在有些晦涩难懂,可能导致你还没开始实践 DDD就打起了退堂鼓。因此,在基础篇中,我希望能带着你一起做好实践前的准备工作。 除此之外,这些名词在你的微服务设计和开发过程中不一定都用得上,但它可以帮你理解DDD 的核心设计思想和理念。而这些思... 阅读全文

DDD(一):为什么选择DDD

2015-11-03 18:26:20

摘要:我们知道,微服务设计过程中往往会面临边界如何划定的问题,微服务到底应该拆多小,不同的人会根据自己对微服务的理解而拆分出不同的微服务,于是大家各执一词,谁也说服不了谁,都觉得自己很有道理。那在实际落地过程中,很多项目在面临这种微服务设计困惑时,是靠拍脑袋硬完成的,上线后运维的压力就可想而知了。那是否有合适的理论或设计方法来指导微服务设计呢?当你看到这一讲的题目时,我想你已经知道答案了。没错,就是... 阅读全文