课程简介
DDD作为一套完整而系统的设计方法,设计过程更加规范将领域模型界限上下文边界快速拆分微服务,实现系统架构适应业务的快速变化,此外,DDD显著降低服务的耦合性,建立核心而稳定的领域模型,利于领域知识的传递与传承。本内容侧重于方法论,基于多年实践领域驱动设计的经验与心得,糅合了 DDD 社区最新发展的理论知识与最佳实践,分享Unix 设计哲学、通用语言关键点扩展 - Pre/Post Condition,通过OLID、SRP、OCP、LSP、ISP、DIP 等原则,覆盖从需求到实现全面系统的讲解领域驱动设计。
课程收益
全面悉知领域驱动设计整体架构
从需求到实现模型的全流程
掌握微服务形式下的CQRS
根据OLID、SRP、OCP、LSP、ISP、DIP 等原则完成对应复杂度
熟练运用团队协作模式以及通信集成模式
受众人群
具有以下经验的 架构师,后端开发工程师,以及其他软件从业人员
① 具有基础的架构设计知识
② 至少掌握一门面向对象语言
③ 具有基本的面向对象程序设计能力
④具有一年或一年以上的业务系统开发经验
课程周期
2天(12H)
课程大纲
标题 | 授课内容 |
一、软件复杂度 - 软件行业的主要任务就是对应复杂度
| ① 领域驱动设计概览 ② 战略与战术 ③ 战略层面的三件事 与 战术层面的核心结构 ④ 软件复杂度的三个成因 ⑤ 分离关注点 – Unix 设计哲学 ⑥ 隔离业务复杂度与技术复杂度 ⑦ 复杂度的横切与纵切 ⑧ SOLID原则 ⑨ SRP – 单一职责原则 ⑩ OCP – 开放封闭原则 ⑪ LSP – 里氏替换原则 ⑫ ISP – 接口隔离原则 ⑬ DIP – 依赖倒置原则 ⑭ 领域驱动设计对软件复杂度的对应 |
二、通用语言 - 工欲善其事必先利其器
| ① 领域专家与开发者的沟通失调 ② 通用语言关键点 - 5W2H1E ③ 通用语言关键点扩展 - Pre/Post Condition ④ 案例 - “高端客户优惠”这个需求如何做? ⑤ 通用语言的价值 ⑥ 通用语言的代码表达 ⑦ 运用领域场景分析提炼领域知识 ⑧ 建立统一语言 |
三、界限上下文 – 有问题必有解决方案
| ① 界限上下文的目的:消除歧义 ② 界限上下文与通用语言 ③ 案例:电商系统下单流程中的界限上下文分析 ④ 不要将有二义性的领域概念放在同一界限上下文中 ⑤ 理解界限上下文 ⑥ 识别界限上下文 ⑦ 理解上下文映射 ⑧ 上下文映射的团队协作模式 ⑨ 上下文映射的通信集成模式 ⑩ 辩别限界上下文的协作关系 |
四、架构 – 总有一款适合你
| ① 认识分层架构 ② 分层架构的演化 ③ 领域驱动架构的演进 ④ 界限上下文与架构 ⑤ 六边形架构 ⑥ 端口与适配器 ⑦ 整洁架构 ⑧ CQRS架构 ⑨ 在CQRS中处理具有最终一致性的查询模型 ⑩ 事件溯源 Event Souring ⑪ 使用乐观锁处理并发更新 ⑫ 事件溯源和发布事件 ⑬ 幂等方式处理消息 ⑭ 使用快照提升性能 ⑮ 管道与过滤器 ⑯ SAGA (消息驱动事务) ⑰ 协同式与编排式 ⑱ SAGA下实现隔离 |
五、实体 – 数据容器还是行为载体
| ① 贫血模型 ② 如何避免贫血,实体与领域服务之间的分寸 ③ 唯一标识 ④ 委派标识 ⑤ 案例:实现实体层超类型(Layer Supertype) ⑥ 实战 - 任务分配执行系统 实体行为归属甄别 |
六、值对象 – 性能提升小帮手
| ① 什么是值对象 ② 值对象的特征 ③ 为什么值对象这么容易被忽略 ④ 案例:地址建模与值对象 ⑤ 案例:实现值对象层超类型 |
七、聚合 – 比类更高一层的封装
| ① 聚合设计原则 ② 聚合设计的过程 ③ 聚合的一致性边界 ④ 一个事务中只处理一个聚合 ⑤ UML 中的聚合 与 DDD 中的聚合 ⑥ 聚合内实现事务一致性 ⑦ 聚合外实现最终一致性 ⑧ 案例:更新订单状态与库存扣减 Version 1.0 ⑨ 案例:更新订单状态与库存扣减 Version 2.0 ⑩ 聚合设计的注意点 |
八、微服务的入口 - 应用服务
| ① 用例 (Use Case) 与应用服务 ② 微服务的网关 与 应用服务 之间的关系 ③ 应用服务中的 编排,转换,验证,转发 ④ 工作单元 (Unit of Work) ⑤ 数据传输对象 (Data Transfer Object) ⑥ 事务脚本 (Transaction Script) 与领域模型 ⑦ 依赖注入在应用服务中的使用 ⑧ 案例:实现应用服务 ⑨ 应用服务的关注点 ⑩ 实战 - 任务分配执行系统 应用层构建 |
九、领域服务 – 不是实体本身的行为都归它
| ① 领域服务的幂等性 ② 案例:实现领域服务 ③ 实战 - 任务分配执行系统 领域服务层构建 |
十、领域事件 – 保持最终一致性的信使
| ① 领域事件是领域建模中极其重要的部分 ② 事务一致性,高并发下的窘境 ③ 最终一致性,妥协带来高扩展性 ④ 原则:一个事务中只对一个聚合进行修改 ⑤ 案例:实现抽象事件源,发布事件源 ⑥ 案例:实现抽象事件处理 ⑦ 案例:实现领域事件的发布与订阅 ⑧ 实战 - 任务分配执行系统 任务分配领域逻辑 |
十一、资源库 – 聚合的起点与终点
| ① 集合特性 ② 资源库与数据访问层的区别 ③ 资源库的误解 ④ 资源库的实现要点 ⑤ 案例:资源库的实现 ⑥ 领域模型 VS 数据模型 ⑦ 案例:泛型资源库 ⑧ 实战:实战 - 任务分配执行系统 持久化 |
十二、微服务中基于事件的系统架构
| ① 微服务之间如何稳健的发布与消费事件 ② 如何保证发布事件的原子性 ③ 使用事件表发布事件 ④ 案例:如何实现事件感知聚合根 ⑤ 案例:如何实现事件感知资源库 ⑥ 如何通过 AOP 进行通用的事件处理 |
十三、微服务形式下的CQRS
| ① DDD中的典型写操作 ② 基于数据模型的读操作 ③ 基于领域模型的读操作 ④ 读写分离模型 ⑤ 案例:电商系统中的读写分离场景 ⑥ 单进程单实体 + 共享存储/共享模型:Inventory详情查询 ⑦ 单进程单实体 + 共享存储/分离模型:Product摘要查询 ⑧ 单进程跨实体 + 分离存储/分离模型:Product详情查询(包含Category信息) ⑨ 跨进程跨实体 + 分离存储/分离模型:Order详情查询(包含Product信息) |
Owen Dai
百林哲咨询(北京)有限公司专家团队成员
Owen Dai
百林哲咨询(北京)有限公司专家团队成员
Owen Dai
百林哲咨询(北京)有限公司专家团队成员
Owen Dai
百林哲咨询(北京)有限公司专家团队成员
Owen Dai
百林哲咨询(北京)有限公司专家团队成员
Owen Dai
百林哲咨询(北京)有限公司专家团队成员