DDD读书笔记
《DDD实战-欧创新》
-
DDD是什么?
“DDD是一种指导思想和方法论,指导拆分复杂业务、划分边界和建设领域模型,并最终指导微服务系统建设落地(draft)”
-
如何使用DDD
“使用事件风暴进行业务领域建模 -> 使用DDD的战术设计,设计聚合、实体、值对象、领域服务、领域事件以及应用服务等领域对象 -> 再使用DDD的分层架构模型(4层)完成微服务的设计”
-
如何进行领域建模?
参照 11 10 | DDD、中台和微服务:它们是如何协作的?
总结:按照业务流程划分领域,划分为核心域、通用域和支撑域到合适的粒度,并反复推敲,对于重复或需要重组的领域对象,提炼并重构主领域对象。
-
使用事件风暴构建微服务步骤
-
第一步:产品愿景
-
对产品顶层价值的设计,使产品目标用户、核心价值、差异化竞争点等信息达成一致
-
例如:为了。。。。。我们需要做。。。。。,为此我们需要xxx核心/通用中台,实现。。。。功能,最终达成。。。。。目标
-
-
第二步:业务场景分析
-
从用户视角触发,根据业务流程或用户旅程,采用用例和场景分析,探索领域中的典型场景,找出领域事件、实体和命令等领域对象,支持领域建模
-
例如:创建系统的命令会触发系统已创建的事件
-
-
第三步:领域建模
-
根据场景分析中产生的领域对象,比如领域事件、命令等,找出产生这些命令的实体,分析实体之间的关系组成聚合,为聚合划定限界上限文,建立领域模型和领域模型之间的依赖,领域模型利用限界上下文向上可以指导微服务设计,通过聚合向下可以指导聚合根、实体和值对象的设计。
-
1.根据事件和命令,提取实体
-
2.从多个实体中找到聚合根,并根据聚合根以及实体之间的依赖关系,组合实体成为聚合
-
3.划定限界上线文,根据上线文归类聚合
-
-
-
第四步:进行微服务设计
-
理论上一个领域模型对应一个微服务,具体实施还是需要根据团队的现状来看。
-
-
-
实体和值对象的区别
实体
值对象
是否有唯一Id
是否有行为
是否是class
-
不一定,可能是class,可能是简单的属性
从属关系
值对象是实体的属性,用于描述实体
定义
代表一个子域,有属性、行为和逻辑,是充血模型
聚合具有相同特征的一类属性(可能就一个,那就不用定义class了),一般没有行为和逻辑,聚合到实体,是实体的一个属性,一般是贫血模型
-
-
聚合根
-
是实体,有生命周期,有全局唯一id,负责协调和组织聚合内各实体和值对象协同完成业务逻辑;
-
一个聚合内只有一个聚合根
-
-
聚合
-
一组业务关系紧密的实体、值对象、聚合很的集合
-
一个微服务有多个聚合,一个聚合有多个实体、值对象、命令、领域事件等。
-
根据需要,一个聚合可以单独拆出来作为微服务,比如这个聚合遇到高并发挑战了。
-
-
领域服务(DomainService)
-
单一实体(或者值对象)不能实现时,领域服务就会出马,它可以组合聚合内的多个实体(或者值对象),实现复杂的业务逻辑。
-
-
实体方法、领域服务、应用服务的区别
类型
说明
所在的包
实体方法
实体entity的function,比如createAddress(),原子业务逻辑
domain.entiry
领域服务
domainService,具体多个实体方法,完成较为复杂的业务功能
domain.service
应用服务
APPService,编排和聚合领域服务,对上层facade提供完成的接口业务能力
application.service
-
命令(动作)
-
一个业务行为,例如支付这个动作
-
-
领域事件
-
命令产生的结果,该结果可能引发后续动作,可能不会引发就此结束;例如支付完成后会产生支付完成事件,会触发财务入账等后续动作。
-
-
DDD分层架构
分层
功能
常见的功能
交互规则和职责边界
用户接口层
-
接受用户指令,展示结果
-
用户
-
程序
-
自动化脚本
-
API
-
DTO
应用层
-
很薄的一层,不干涉领域行为
-
能够快速响应业务需求
-
实现面向用户操作相关的用例和流程
-
协调和组织多个聚合,完成业务逻辑
-
组合、编排和转发服务
-
负责处理业务用例的执行顺序以及结果的拼装
-
安全认证
-
权限校验
-
事务控制
-
发送或订阅领域事件
-
Application service
领域层
-
包括实体、值对象、领域服务和聚合
-
保持长期稳定
-
聚合(Aggregate)
-
Entity
-
ValueObject
-
DomainService
-
-
MapperXML
-
Repository(仓储接口)
基础设施层
-
贯穿所有层,为其他各层(即用户接口层、应用层和领域层都可以访问该层)提供通用的技术和基础服务
-
数据库
-
缓存
-
消息中间件
-
第三方工具
-
驱动
-
网关
-
文件
-
Repository AOP(仓储实现)
-
缓存
-
消息中间件
-
第三方工具
-
驱动
-
网关
-
文件
-
-
边界
边界
说明
逻辑边界
聚合的编辑
物理边界
微服务之间的边界,不同微服务部署位置和运行环境是相互隔离的
代码边界
不同层或者聚合之间代码目录的边界