DDD学习资料(持续更新)
文章目录
- DDD学习资料(持续更新)
-
-
DDD图书
-
DDD概念
-
DDD代码示例
-
架构
-
Bounded Context
-
工具
-
Event Storming
-
Event Storming图例
-
- Event Storming Concepts Cycle
- Big Picture Event Storming
- Design Level Event Storming
- Event Storming Use Case
- Event Storming Sample (购物车支付例子)
-
微服务设计与DDD
-
Spring与DDD
-
- Domain Layer设计原则
- 各层说明
-
- Application 层
-
Domain 层
-
Infrastructure 层
-
UML
-
公众号和社区专栏
-
- 领域驱动设计十五年
-
证据风暴 (Evidence Storming)
-
DDD的电商例子
-
- Domain Model Example
-
DDD学习资料(持续更新)
DDD图书
DDD图书
- 《领域驱动设计:软件核心复杂性应对之道》Eric Evans
- 《实现领域驱动设计》Vaughn Vernon
- 《Domain Driven Design Quickly》Abel Avran & Floyd Marinescu
- 《领域驱动设计精粹》Vaughn Vernon
分析模式
- 《分析模式:可复用的对象模型》Martin Fowler
面向对象
- 《UML和模式应用》第9章 领域模型
- 《UML精粹:标准对象建模语言简明指南》
DDD概念
DDD代码示例
- DDD Sample via Eric Evans
- IDDD Sample via VaughnVernon
- awesome-ddd
- ddd-leaven-v2
- Spring DDD Sample via eugenp
架构
- 三层架构 (UI层、Business Logic层、Data Access层)
- DDD四层架构(UI层、Application层、Domain层、Infrastructure层)
- 六边形架构 Hexagonal (Ports & Adapters) Architecture
- 事件溯源架构(Event Sourcing)
- 命令和查询职责分离(CQRS)
- 响应式架构和Actor模型(Reactive)
- 整洁架构(Clean Architecture)
- 清晰架构(Explicit Architecture)
References:
- 从三明治到六边形
- Netflix | Ready for changes with Hexagonal Architecture
- Netflix 的六边形架构实践
- Design a DDD-oriented microservice | 四层架构
- Layered Architecture
- DDD, Hexagonal, Onion, Clean, CQRS, … How I put it all together
- Qinyu | 简书
- @hgraca
- The Clean Architecture
- 【翻译】六边形架构
Bounded Context
工具
UML
Event Storming
GOTO 2018 • 50.000 Orange Stickies Later • Alberto Brandolini
Alberto Brandolini - 100,000 Orange Stickies Later | Øredev 2019
Event Storming - Alberto Brandolini - DDD Europe 2019
Crunching ‘real-life stories’ with DDD & Event Storming - Kenny Baas-Schwegler - KanDDDinsky 2018
A facilitators recipe for Event Storming
Event Storming - How to deal with complexity and improve your domain design
Event Storming: the first step of a business modernization journey with Cassie Shum
The Domain - First Pop Coffee Company
Decomposing the Monolith with Event Storming
Event Storming图例
Event Storming Concepts Cycle

Big Picture Event Storming

Design Level Event Storming

Event Storming Use Case
Actor -> Command -> Aggregate -> Event -> Read Model -> UI

举例:
- Actor, Command, Event (我,支付了订单,订单已经被支付了。)
- Actor, Read Model, Command, Event (我,看见绿灯亮了,决定过马路 ,我已经过了马路)
- Actor,Read Model,Command, Event(我,看了一下菜单,选了几个菜,我已经选好餐了)
Event Storming Sample (购物车支付例子)

微服务设计与DDD
Bounded Contexts, Microservices, and Everything In Between - Vladik Khononov - KanDDDinsky 2018
Event Storming - Kick-Start Your Microservices Architecture
Designing Events-First Microservices
Creating event-driven microservices: the why, how and what by Andrew Schofield
GOTO 2019 • Event-Driven Microservices, the Sense, the Non-sense and a Way Forward • Allard Buijze
GOTO 2017 • The Many Meanings of Event-Driven Architecture • Martin Fowler
GOTO 2014 • Microservices • Martin Fowler
Developing microservices with aggregates - Chris Richardson
Microsoft Azure - 使用DDD设计微服务架构
ThoughtWorks | Testing Strategies in a Microservice Architecture
Martin Fowler | Software architecture guide
Building Domain Driven Microservices
Design a DDD-oriented microservice
Spring与DDD
- Event-Driven Architectures for Spring Developers
- Implementing DDD with the Spring Ecosystem by Michael Plöd @ Spring I/O 2018
- mploed / ddd-with-spring
- Organizing Layers Using Hexagonal Architecture, DDD, and Spring
Domain Layer设计原则
- 可以独立开发而不需要依赖Spring Boot,不使用Spring bean injection, Spring annotations, Spring auto configuration
- 可以独立测试而不需要依赖Spring Boot Test
- 可以独立存取数据,而不需要关心数据库类型,比如关系型数据库或NoSQL
- 可以独立发送和接收消息,而不需要关心消息代理类型,比如RabbitMQ或Kafka
各层说明
Application 层
- Spring Controller (
@RestController) - Spring Service (
@Service) for Application Service
Spring Configuration(@Configuration) for Application
Domain 层
- Domain entities
- Value objects
- Domain object factories
- Business rules
(policy)
Domain Services Repository interfaces
Infrastructure 层
-
Spring JPA entities (
@Entity) -
Repository implementation implements
Repository interfaces defined in Domain Layer -
Bean Configuration (
@Configuration) for Domain Services -
Spring Configuration (
@Configuration) for Infrastructure, e.g.
Database, Message broker
UML
- UML Tutorial
- Diagram.net (draw.io) - Online Diagram Software
- PlantUML,可用在线编辑器 或 Intellij PlantUML Integration插件。
公众号和社区专栏
- DDD和微服务
- 领域驱动设计中国社区官方专栏
领域驱动设计十五年
- 前言
- 第1章 提炼DDD的首要原则(1)
- 第1章 提炼DDD的首要原则(2)
- 第1章 提炼DDD的首要原则(3)
- 第2章 面对无聊的领域是用DDD还是不用
- 第3章 利用事件风暴发现限界上下文(1)
- 第3章 利用事件风暴发现限界上下文(2)
- 第4章 在改善中浮现上下文
- 第5章 夜巡
- 第6章 痕迹、踪迹、足迹与路径: 探索软件设计之路 (1)
- 第6章 痕迹、踪迹、足迹与路径: 探索软件设计之路 (2)
- 第6章 痕迹、踪迹、足迹与路径: 探索软件设计之路 (3)
- 第6章 痕迹、踪迹、足迹与路径: 探索软件设计之路 (4)
- 第6章 痕迹、踪迹、足迹与路径: 探索软件设计之路 (5)
- 第7章 统一语言并不仅仅是共享词汇
- 第8章 领域模型与代数数据类型(1)
- 第8章 领域模型与代数数据类型(2)
- 第8章 领域模型与代数数据类型(3)
- 第8章 领域模型与代数数据类型(4)
- 第8章 领域模型与代数数据类型(5)
- 第9章 用幺半群进行领域建模(1)
- 第9章 用幺半群进行领域建模(2)
- 第9章 用幺半群进行领域建模(3)
- 第9章 用幺半群进行领域建模(4)
- 第9章 用幺半群进行领域建模(5)
- 第10章 加强领域驱动设计
- 第11章 你在构建正确的软件吗?(1)
- 第11章 你在构建正确的软件吗?(2)
- 第11章 你在构建正确的软件吗?(3)
- 第12章 多规范模型 | Martin Fowler
- 第13章 从人工决策到提供建议,再到自动化决策
- 第14章 时间
- 第15章 领域对象发展的极致就是代理
- 第16章 领域驱动设计即程序员的代码易用性
- 第17章 模型探索漩涡
- 第18章 领域驱动设计即中心集
- 第19章 被误解的口头禅 (1)
- 第19章 被误解的口头禅 (2)
- 第20章 消除协作障碍
- 第21章 暂缺
- 第22章 解决ERP软件中的复杂性:献给限界上下文的情歌
- 第23章 暂缺
证据风暴 (Evidence Storming)
在Event Storming中会有事件风暴和命令风暴的活动。除此之外,还可以有证据风暴(Evidence Storming)。证据风暴就是找出业务流程中的单据、票据、凭证与合约。再通过这些证据审视是否遗漏了一些参与者、流程和领域模型。
通常
- 这些证据也就是聚合。
- 不同的证据往往是分支子流程。
- 对合约的开始生效、开始履行、履行结束、提前结束、变更、终止通常是重要的领域事件。
- 对违约情况的处理则是分支子流程。
| 场景 | 证据(Evidence) | 合约类型 | 当事人 | 作为…的证据 (AS Evidence) |
|---|
| 网购| 订单| 买卖合约| 顾客、卖家| 订单作为顾客向卖家购买商品的证据。
顾客支付订单作为买卖合约开始生效的证据。
顾客确认收货作为买卖合约履行结束的证据。 |
| | 物流单| 运送合约| 快递公司、寄件人(仓库)、收件人(顾客)| 物流单作为快递公司接受寄件人委托,为收件人配送包裹的证据。
快递公司开出物流单,作为运送合约开始生效的证据。
收件人签收物流单作为运送合约成立的证据。 |
| 退货单 | 买卖合约规定的退货情形 (或退货合约) | 顾客、卖家 | 退货单作为顾客收到货后,向卖家退货的证据。 | |
|---|---|---|---|---|
| 宽带故障维修 | 报障单 | 租赁合约规定的售后情形(或售后合约) | 宽带用户、客服 | 报障单作为客服受理宽带用户报障的证据。 |
| 维修单 | 租赁合约规定的售后情形(或售后合约) | 客服、维修人员 | 维修单作为客服派工给维修人员的证据。 |
| | 维修单| 租赁合约规定的售后情形(或售后合约)| 维修人员、宽带用户| 维修单作为维修人员上门为宽带用户提供维修服务的证据。
宽带用户签字确认维修单,作为维修工作完成的证据。 |
| 出库单 | 仓库备品备件管理规定 | 仓库、维修人员 | 出库单作为维修人员从仓库领取备品备件的证据。 | |
|---|---|---|---|---|
| 投诉单 | 租赁合约规定的投诉情形(或售后合约) | 宽带用户、客服 | 投诉单作为客服受理宽带用户投诉的证据。 |
| 网约车| 订单| 租赁合约(或乘车合约)| 乘客、司机| 订单作为乘客要求司机提供乘车服务的证据。
司机接单作为乘车合约的开始生效。
乘客上车作为乘车合约的开始履行。
乘客到达目的地作为乘车合约的履行的结束。
乘客中途修改目的地为对乘车合约的变更。 |
|投诉单|租赁合约规定的投诉情形(或售后合约)|乘客、网约车平台|投诉单作为网约车平台受理乘客投诉的证据。||
| 网上挂号| 订单| 买卖合约(或挂号合约)| 病人/家属、医院| 订单作为病人/家属要求医院提供诊治的证据。
病人/家属支付订单作为挂号合约开始生效的证据。 |
|挂号单(纸质)|诊治合约|病人、医院|挂号单(纸质)作为病人已经到达医院,准备看诊(履约)的证据,也作为医院准备好为病人提供诊治服务的证据。||
| 乘坐飞机| 订单| 买卖合约(或购票合约)| 乘客、航空公司| 订单作为乘客要求航空公司提供乘机服务的证据。
乘客支付订单作为购票合约开始生效。
航空公司出票作为购票合约的完成。 |
| 机票 | 乘机合约 | 乘客、航空公司 | 机票作为航空公司为乘客提供乘机服务的合约。 | |
|---|---|---|---|---|
| 行李托运单(一般附在纸质登机牌上) | 行李托运合约 | 乘客、航空公司 | 行李托运单作为乘客委托航空公司随机运送行李的证据。 | |
| 行程单 | 乘机合约规定的报销情形(或报销合约) | 乘客、航空公司 | 行程单作为乘客要求航空公司提供的报销凭证。 |
DDD的电商例子
DDD最爱的电商例子。
电商流程:
- 浏览商品 (product),商品信息包括:商品名称(product title),规格尺寸(size/dimensions),价格(price)等。
- 把商品加入购物车(shopping cart)
- 结账(checkout),生成订单(place order)
- 付款(payment),付款时可使用优惠券(discount code)
- 扣减库存(inventory)
- 仓库收到订单(receive order),拣货(picking),打包(packing)
- 快递发货(shipping)
- 客户收货确认(shipping confirmation)
- 如果客户收到货后不满意,在符合退换货政策(return policy)的情况下,可发起退货(return)和退款(refund)
简单的总结就是围绕着“订单(合约)的生效,以及对订单(合约)的履约”:
- 客户:挑选商品,结账,付款,生成订单。
- 卖家/平台/仓库/快递:对订单进行履约(Order fulfilment process)。
- 客户:对订单履约情况进行评价,或发起售后。
- 卖家/平台/仓库/快递:响应客户的评价或售后流程。
责任说明:
- 客户的责任:按照订单付款。
- 平台的责任:第三方担保,处理购物纠纷,客户服务。
- 卖家的责任:按照订单委托仓库发货。
- 仓库的责任:按照订单打包发货,委托快递公司配送。
- 快递公司的责任:按照快递单的信息配送,保证包裹送达。
合约包括:
- 订单 (核心合约)
- 支付记录 (可认为是订单合约的支付部分)
- 快递单 (可认为是订单合约的配送部分)
- 退换货政策 (可认为是订单合约的售后部分)
References:
- https://www.absoluteweb.com/ecommerce-guide-frequently-used-terms-to-know/
- https://www.codelessplatforms.com/blog/ecommerce-process-flow/
Domain Model Example
用UML类图(class diagram)来表示领域模型。在概念模型阶段,UML类图的类定义可以只定义类名。到设计阶段,就需要定义UML类图的类的属性和方法。
常用的UML类图关系:
- Association 关联 (实心线,无箭头)
- Composition 组合(实心菱形线,无箭头),表示同生命周期,用来表达DDD的Aggregate
- 一对零,一对一,一对多等关系 (如果存在多对多,通常意味着丢失了中间概念。)
- 常见的中间概念有明细(item)、成员(member)和条目(entry)
Example:
- Online Shopping Domain Model
- Hospital Management Domain Model
- Library Domain Model
- Band Account Domain Model
参考文档:
