机票辅营DDD的分层架构设计
如果无法正常显示,请先停止浏览器的去广告插件。
1. 机票辅营DDD的分层架构设计
钟福海/机票辅营
2. 自我介绍
2018年12月加入去哪儿,负责机票辅营业务开发和系统重构
热衷于通过技术升级解决业务痛点问题,提升复杂系统可维护性
课程背景
DDD基础和DDD实践(已完结)侧重DDD方法论(工具应用)
业务架构(进行中),侧重业务实践(项目经验)
内容介绍
3. 案例1:供应系统DDD实践
CONTENTS 目录
案例2:交易系统DDD实践
4. 背景:辅营介绍
01 辅营业务场景
02 辅营业务边界
5. app首页
机票首页
6. 航班列表
OTA列表
填单页
详情
7. 售前
售后
8. 辅营业务边界
9. 背景:供应系统介绍
第一个用DDD设计的系统
从辅营交易系统拆分出来
定位是负责与供应商交互
主要处理权益的发/查/废业务
10. 案例1:供应系统DDD分层设计
01 领域模型(战略设计)
02 CQRS(战术设计)
03 整洁架构(战术设计)
DDD = 领域模型(构建步骤)+ 分层架构(技术方案)
11. 回顾:DDD设计流程
来源:https://mp.weixin.qq.com/s/JlIHUTRwpJMyenDb_LhOeg
12. 回顾:常规的战略设计流程
来源:https://mp.weixin.qq.com/s/JlIHUTRwpJMyenDb_LhOeg
13. 1、领域模型:供应系统战略设计
场景分析
业务专家基于业务场景,划分供应子系统(领域划分)
事件风暴
业务专家根据发/查/废/使用等用例,识别领域对象和行为
14. 回顾:常规领域模型
来源:https://mp.weixin.qq.com/s/JlIHUTRwpJMyenDb_LhOeg
15. 1、领域模型:供应系统的实现
16. 1、领域模型:供应订单域代码落地
17. 回顾:DDD的分层架构
来源:https://mp.weixin.qq.com/s/JlIHUTRwpJMyenDb_LhOeg
18. 2、CQRS:概念
独立模型
模型共用
来源:https://martinfowler.com/bliki/CQRS.html
19. 2、CQRS:优势
来源:https://processon.com/view/5d6c8dbee4b0f425534784f8
20. 2、CQRS:供应系统的实现
21. 回顾:整洁架构
分层解耦
单向依赖
来源:https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
22. 3、整洁架构:use case代码举例
23. 案例1:供应系统总结
背景:新系统,业务明确
工具:DDD建模
落地:整洁架构+CQRS
24. 辅营交易系统重构的背景
客观原因:业务复杂
8核心系统10+关联系统
6年36.5万行
频繁变更
直接原因:缺设计和规范 成本压力
直接影响:维护成本高 难复用,难更改
难理解,难测试
发展诉求:支撑更多业务线 火车,酒店,国际
超商,会员,分销
25. 思考: DDD做设计 VS 做参考?
DDD做设计(自顶向下,有条不紊)
资源,团队,时间
DDD做参考(抓大放小,各个击破)
重点,变通,演进
26. 案例2:辅营交易系统DDD的过渡
01 业务梳理(可维护性)
02 封装变化(可扩展性)
03 模块划分(可维护性)
04 分层测试(可维护性)
27. 1、业务梳理:领域建模还可以这么整?
售前
售后
28. 1、业务梳理:系统边界=限界上下文?
29. 1、业务梳理:重新梳理核心用例?
30. 高频需求都这么麻烦?
31. 2、封装变化:背景
看哪里
业务很发散
调用链路深
圈复杂度高
劣质&有毒
改哪里
霰弹式开发
测试链路长
踩坑&挖坑
32. 2、封装变化:解决方案
33. 2、封装变化:效果
34. 交易系统封装变化
35. 交易系统封装变化
36. 2、封装变化:总结
看哪里
业务梳理(文档)
单元测试(校验)
接口抽象(及时 )
改哪里
桥接模式(扩展)
接口抽象(解耦)
37. 3、模块划分:背景
38. 3、模块划分:领域模型的问题
39. 3、模块划分:领域模型的改进
40. 3、模块划分:贫血模式的聚合根
41. 3、模块划分:系统架构图
业务控制流程图
分层架构逻辑视图
42. 3、模块划分:整洁架构代码实现
43. 3、模块划分:控制流程图
44. 3、模块划分:重构前的业务流程
45. 3、模块划分:重构后的业务流程
46. 交易模块划分
47. 3、模块划分:辅营交易的控制流程图
48. 3、模块划分:从adapter看控制流
49. 4、分层测试:重构代码的测试
50. 案例2:交易系统总结
背景:老系统,业务繁杂
工具:DDD建模+架构演进
落地:整洁架构+Use Case
51. 分层测试:分层测试有哪些优势?
降低测试复杂度(跨层/mock)
方便分工协作:(分层解耦)
方便独立维护:(高内聚)
利于规范检查:(高质量,好测试)
52. 分层测试:微服务测试关注点
来源:https://martinfowler.com/articles/microservice-testing
53. 分层测试:常规的分层测试举例
54. 分层测试:辅营交易的测试现状
现状:
测试包没按照整洁架构分层
测试用例按照分层关注点组织
改进:
源码和测试包按分层拆分物理组件
用archunit检查架构和包结构约束
55. 课程总结
协议 统一标准,共同视角
分治 化繁为简,各个击破
分层 依赖倒置,分层解耦
演进 抓大放小,先易后难,完成胜于完美
56.