# 第02节:搭建DDD四层架构
作者:小傅哥
博客:https://bugstack.cn (opens new window)
沉淀、分享、成长,让自己和他人都能有所收获!
- 分支:210801_xfg_initProject (opens new window)
- 描述:基于DDD架构模型,初始化搭建工程结构
本节是陆续搭建系统和编码的开始,我们会优先完成一个基础工程的创建。一般在互联网企业这部分工作可能不需要反复处理,只需要在承接产品需要后使用脚手架或者直接复制以往工程就可以创建现有需要使用的工程了。例如 Spring 官网也提供了创建工程的脚手架,https://start.spring.io (opens new window) Spring Initializr 本质上也是一个 Web 应用,它可以通过 Web 界面、Spring Tool Suite、IntelliJ IDEA 等方式,构建出一个基本的 Spring Boot 项目结构。但是,我们创建的项目结构并不是一个简单的 MVC 结构,而是需要基于 DDD 四层架构进行模块化拆分,并把分布式组件 RPC 结合进行,所以这里我们需要进行框架搭建。
# 零、优秀作业
- 之前还是MVC的思想,整体还是对DDD没有很多头绪 @杭电鬼先生 (opens new window)
- 搭建DDD四层架构 @一点江南 (opens new window)
- 抽奖系统搭建(DDD + RPC)架构 @sky是清新色 (opens new window)
- 搭建DDD+RPC架构总结 @Eʟɪᴀᴜᴋ. (opens new window)
- 初步学习了DDD思想,跑通了第三节 @大琨 (opens new window)
- 总结:对于dubbo框架和rpc这些概念一头雾水 @BerserkD (opens new window)
- 问题:DDD是要解决什么问题,或者说为什么要使用DDD? (opens new window)
- 入手项目,学习DDD架构的思想,动手写代码构建项目 @Chin (opens new window)
- 疑问:领域层包与包之间是完全隔离的么?通信是不是都要通过应用层(application)编排调用,或发送事件? @在下不才 (opens new window)
- 认识DDD:习惯MVC模式,对于DDD有些不理解 @Tong Hui (opens new window)
- 配置项目环境,跑通项目代码、学习DDD架构思想 @HL (opens new window)
- 了解环境,配置,规范,搭建DDD+RPC架构 @xbhog (opens new window)
- 遇到的问题如下:(主要出在项目搭建与启动上) @浩 (opens new window)
- 完成项目结构的搭建,项目驱动学习的理念确实不错!@ Ad. (opens new window)
- 个人对DDD架构的一点理解,以及和MVC架构中的对比。@陈晓川 (opens new window)
# DDD 分层架构介绍
DDD(Domain-Driven Design 领域驱动设计)是由Eric Evans最先提出,目的是对软件所涉及到的领域进行建模,以应对系统规模过大时引起的软件复杂性的问题。整个过程大概是这样的,开发团队和领域专家一起通过 通用语言(Ubiquitous Language)去理解和消化领域知识,从领域知识中提取和划分为一个一个的子领域(核心子域,通用子域,支撑子域),并在子领域上建立模型,再重复以上步骤,这样周而复始,构建出一套符合当前领域的模型。
依靠领域驱动设计的设计思想,通过事件风暴建立领域模型,合理划分领域逻辑和物理边界,建立领域对象及服务矩阵和服务架构图,定义符合DDD分层架构思想的代码结构模型,保证业务模型与代码模型的一致性。通过上述设计思想、方法和过程,指导团队按照DDD设计思想完成微服务设计和开发。
- 拒绝泥球小单体、拒绝污染功能与服务、拒绝一加功能排期一个月
- 架构出高可用极易符合互联网高速迭代的应用服务
- 物料化、组装化、可编排的服务,提高人效
服务架构调用关系
- 应用层{application}
- 应用服务位于应用层。用来表述应用和用户行为,负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装。
- 应用层的服务包括应用服务和领域事件相关服务。
- 应用服务可对微服务内的领域服务以及微服务外的应用服务进行组合和编排,或者对基础层如文件、缓存等数据直接操作形成应用服务,对外提供粗粒度的服务。
- 领域事件服务包括两类:领域事件的发布和订阅。通过事件总线和消息队列实现异步数据传输,实现微服务之间的解耦。
- 领域层{domain}
- 领域服务位于领域层,为完成领域中跨实体或值对象的操作转换而封装的服务,领域服务以与实体和值对象相同的方式参与实施过程。
- 领域服务对同一个实体的一个或多个方法进行组合和封装,或对多个不同实体的操作进行组合或编排,对外暴露成领域服务。领域服务封装了核心的业务逻辑。实体自身的行为在实体类内部实现,向上封装成领域服务暴露。
- 为隐藏领域层的业务逻辑实现,所有领域方法和服务等均须通过领域服务对外暴露。
- 为实现微服务内聚合之间的解耦,原则上禁止跨聚合的领域服务调用和跨聚合的数据相互关联。