复杂软件设计之道:领域驱动设计全面解析与实战
上QQ阅读APP看书,第一时间看更新

前言

“领域驱动设计”一词源于Eric Evans在2004年出版的图书《Domain-Driven Design:Tackling Complexity in the Heart of Software》,而Eric Evans也因此被称为“领域驱动设计之父”。领域驱动设计简称DDD,它是面向对象、设计模式、函数式编程的集大成者,是软件设计发展的主要方向之一。DDD诞生十多年来一直处于高速发展中,其超前思想正在指引着企业软件技术的发展,清洁(Clean)架构、六边形架构、CQRS架构、事件溯源架构、微服务架构、无服务器架构等都与DDD有着紧密联系,DDD更是微服务架构实现的基础知识。

DDD是一种平衡业务和技术设计的方法学。通常,我们把产品经理或领域专家称为业务人员,把程序员称为技术人员,一套高质量的软件产品或项目需要两者合作才能完成,但是由于他们各自的领域背景不同,所以难以沟通和合作,而DDD则提供了一套业务建模与实现方法来消除两者间的隔阂。

为什么写这本书

写这本书的原因有二。

DDD中引入了上下文、聚合等难以理解或实践的概念,导致新手入门和使用比较难,而笔者自DDD出现以来,一直专注于其中,并在以jdon为主的分享平台上不断记录自己的使用心得和国外DDD的最新发展情况,所以编写此书,并且以国内软件设计人员更易理解的结构和语言对Eric Evans所著书中的抽象概念、建模方法进行了梳理和全面解析,以此作为多年沉淀的总结。这是原因之一。

自DDD出现以来,随着软件系统的日益复杂,其越发受到软件设计开发相关人员的重视,也得到了新的发展,比如事件溯源、事件风暴会议、失血/贫血模型与充血模型。对DDD中术语的逐步统一和规范,与各种典型技术与架构的结合实现……这是笔者编写本书的原因之二,即梳理DDD的现有发展成果,包括与DDD相关的技术与架构。

这本书写给谁

本书主要面向拥有一定实践经验的软件产品经理、领域专家、软件设计开发相关从业人员,产品经理等业务专家可以着重阅读前三个章节。

如果你是一个软件开发新手或还是一个在校学生,也推荐你阅读本书,因为其中的软件设计开发思路与方法定能为你带来极大启发。

如何阅读本书

本书分为7章,首先从DDD的起源、发展、特点等方面出发,呈现了DDD的全貌,然后分别介绍了领域驱动战略设计、聚合设计、实体和值对象、CQRS架构、事件溯源,最后对DDD中经典的货物运输系统案例进行了完整、详细的讲解。

除了各章专门的实例解析外,每个概念或方法的讲解中都穿插了具体实例,读者可以结合实例来理解DDD,学习DDD模型从无到有的分析过程。此外,本书也提供了开放的源码实现,还可通过书中的链接进行知识拓展。

如需获取书中所有链接的列表以方便查看其中内容,可添加机械工业出版社计算机分社官方微信,回复66112即可。

本书采用Java语言来具体实现,并涉及大量软件系统实现相关的技术和架构,主要包括数据库、Spring Boot、微服务、分布式事务等,读者在学习DDD建模方法的同时,也可以掌握这些技术、架构在DDD等实现中的灵活应用。

本书主要内容

本书各章内容大致如下。

第1章是领域驱动设计基础,介绍了DDD的起源、发展、特点、难点、应用场景,其中对领域复杂性、领域边界、业务策略和业务规则、统一语言和有界上下文等DDD建模方法中的关键概念和过程进行了综述,让读者对DDD建模的总体方向和思路有一个了解。

第2章是领域驱动战略设计。领域驱动设计分为战略设计和战术设计两个部分,本章的战略设计从宏观角度进行领域的分析设计,主要讲解了有界上下文、统一语言及多种有界上下文发现方法,也包括对业务平台与中台设计、事件风暴会议的介绍。

第3章是聚合设计,属于设计代码阶段,是战术设计部分,它与实体、值对象等对象类型概念共同表达领域模型。本章在介绍聚合设计概念的基础上,又详细讲解了设计聚合的几种方法,包括改变主谓宾顺序、根据领域事件设计聚合、根据单一职责设计聚合、按时间边界设计聚合等,最后以订单系统为例进行了实战解析。

第4章是实体和值对象,包括对实体的标识、设计、创建以及值对象与实体的区别、用值对象重构等的描述,并介绍了失血/贫血模型、充血模型、仓储,最后通过一个论坛系统对这些概念和过程进行了详细解析。

第5章是CQRS架构,基于对MVC模式、传统三层架构、传统DDD分层架构、清洁架构、六边形架构、垂直分片架构等的介绍与对比,主要讲解了CQRS架构的特点与实现,包括命令与查询分离、数据访问方式、数据同步等内容,最后是一个使用Axon框架实现CQRS架构的案例。

第6章是事件溯源,介绍了事件溯源的概念、优点与实现,具体包括基于事件溯源的聚合根设计、微服务中的分布式事务实现、使用Apache Kafka实现事件溯源、投射模式、更改数据捕获等内容。

第7章是货物运输系统。Eric Evans的DDD原著中,该案例被拆分到了不同章节,考虑初学者更希望看到完整的分析和实现过程,从而更好地将理论应用于实战,本章从领域描述、发现领域事件、划分有界上下文到聚合设计与代码实现,对货物运输系统的DDD建模过程进行了全面、详细的阐述。

致谢

感谢曾任IBM咨询顾问的陈庆春同行的支持;感谢这些年来为笔者提供DDD项目实践、培训和咨询机会的各大软件企业;感谢机械工业出版社提供出版机会。

最后,DDD的普及与发展需要更多人的加入与实践,希望本书能起到抛砖引玉的作用。本书多少带有笔者个人背景下的“偏见”,书中不足之处在所难免,敬请广大读者不吝指正,也可访问www.jdon.com(解道JDON)进行交流。