《2018年如何讓DDD落地.pdf》由會員分享,可在線閱讀,更多相關《2018年如何讓DDD落地.pdf(32頁珍藏版)》請在三個皮匠報告上搜索。
1、?DDD?和堅AGENDA01為什么DDD落地難02從需求到代碼03當需求發生變化時04把大象塞進冰箱01 為什么DDD難落地從2003年由Eric Evans提出DDD以后,在軟件開發領域一直都是雷聲大,雨點小。這幾年之所以開始火起來,主要的功勞也要給隊友“微服務”,那么這是為什么呢?DDD的目標是什么軟件設計的門檻是什么DDD里難懂的概念誰來做領域專家?產品經理技術組長架構師系統分析師如何從需求到DDD?我想要一個電商平臺,我可以在上面賣東西?Event Storming里缺少了什么信息提交訂單的時候要做什么檢查?如何添加商品?支付訂單的時候和支付寶對接的邏輯是什么樣的?魔鬼隱藏在細節之中
2、今天既然是講落地,那么就從一個實際需求出發,我們看看如何把需求拆解成用戶故事,然后如何把用戶故事轉變成領域故事,最后領域故事又如何變成為代碼。02 從需求到代碼京西商城的需求產品運營人員可以添加新的商品,編輯產品庫存,并發布到京西商城,用戶可以進行購買;京西商城的買家可以查看產品可購買的庫存數量,并生成購買訂單,買家可以撤單,查看訂單的狀態,對訂單進行支付(支付寶)。支付成功后,倉儲管理員會收到出庫請求,進行配貨并發貨。同時,買家可以查看物流狀態以及確認收貨。事件風暴的結果事件風暴得到的命令和事件就沒用了嗎?訂單 已創建庫存 已鎖定提交 訂單用戶SubmitOrderCommandOrderC
3、reatedStockLocked訂單聚合創建訂單服務接收倉庫聚合的事件訂閱者倉庫聚合鎖定庫存服務發送LockStockCommand生成生成接收生成QueryOrderCommand訂單域查詢服務接收OrderList生成需求分析到用戶故事Story6 創建訂單 作為一個商城顧客 我可以確定購物車中的商品和數量,然后提交商品訂單 為了在商城上購買商品Acceptance Criteria 1-Given:導航【購物車】-When:確定購物車中要提交的商品和數量,然后點擊提交;-Then:訂單成功提交,從商品庫存中鎖定訂單的數量,提示氣泡“商品已保存成功”-And when:如果訂單的數量超過
4、商品庫存中可以鎖定的數量-Then:訂單無法成功提交,提示氣泡“庫存數量不夠,僅剩X件”用戶故事到領域故事點擊提交按鈕后1.訂單API控制器會收到創建訂單請求,然后根據請求生成創建訂單命令,然后讓創建訂單應用根據創建訂單命令創建商品2.創建訂單應用收到命令后,先調用查詢商品庫存服務查找商品庫存,如果商品庫存可以支持訂單數量,就讓創建訂單服務根據創建訂單命令進行訂單創建,創建成功后返回成功結果給訂單API控制器如果商品庫存不支持訂單數量,返回出錯結果和原因給訂單API適配器 3.創建訂單服務收到命令后,會把創建訂單命令轉換成訂單,然后調用訂單倉庫進行保存,保存成功后會讓事件發布器發布訂單已創建事
5、件 4.事件發布器會根據事件類型把訂單已創建事件轉發給商品庫存訂閱者,5.商品庫存訂閱者收到事件以后會根據事件中的商品ID和訂單數量創建鎖定商品庫存命令,然后給鎖定商品庫存服務進行庫存鎖定6.鎖定商品庫存服務收到命令后,會把根據命令中的商品ID從商品庫存倉庫中獲取商品庫存,然后根據讓商品庫存鎖定訂單數量,之后調用商品庫存倉庫進行保存,最后讓事件發布器發布商品庫存已鎖定事件.領域故事中的主要對象領域對象類型命名訂單API控制器AdapterOrderController創建訂單命令CommandCreateOrderCommand創建訂單應用ApplicationServiceCreateOrd
6、erApplication查詢商品庫存服務DomainServiceQueryStockService商品庫存EntityStock訂單EntityOrder訂單倉庫RepositoryOrderRepository訂單已創建EventOrderCreated商品庫存訂閱者SubscriberStockEventSubscriber鎖定商品庫存命令CommandLockStockCommand鎖定商品庫存服務DomainServiceLockStockService商品庫存倉庫RepositoryStockRepository商品庫存已鎖定事件EventStockLocked領域模型如何區分實
7、體和值對象?VS?Id?/?Order/Car?Equals()?/?(Immutable)?Address/Color如何區分應用服務和領域服務應用服務(很薄,沒有業務邏輯)領域聚合A領域聚合B領域聚合C領域服務領域服務領域服務X領域服務之間最好不要相互直接調用使用什么架構六邊形架構為什么是六條邊領域故事中的對象怎么對應到架構上命名OrderControllerCreateOrderCommandCreateOrderApplicationQueryStockServiceStockOrderOrderRepositoryOrderCreatedStockEventSubscriberLoc
8、kStockCommandLockStockServiceStockRepositoryStockLocked領域層不應該有任何外部依賴細節OrderController適配器層領域層CreateOrderApplicationOrderRepositoryJPAAPIDBOrderRepositoryMybatis訂單聚合倉庫聚合領域層領域故事如何變成代碼創建訂單服務收到命令后,會把創建訂單命令轉換成訂單,然后調用訂單倉庫進行保存,保存成功后會讓事件發布器發布訂單已創建事件 軟件中最痛苦的就是需求經常發生變化,這也是DDD想要解決的問題之一,03 當需求發生變化時為什么需求會變化?需求提出者
9、不一定想好了需求提出者的問題變化了溝通過程信息丟失需要增加一些業務邏輯時3.創建訂單服務收到命令后,會把創建訂單命令轉換成訂單,然后調用訂單倉庫進行保存,保存成功后會讓事件發布器發布訂單已創建事件 4.事件發布器會根據事件類型把訂單已創建事件轉發給商品庫存訂閱者,訂單日志訂閱者5.6.7.訂單日志訂閱者收到訂單已創建事件后,會根據事件創建添加訂單日志命令,然后調用添加訂單日志服務來進行添加8.添加訂單日志服務收到命令后,會把添加訂單日志命令轉換成訂單日志,然后調用訂單日志倉庫保存訂單日志Acceptance Criteria 1-Given:導航【購物車】-When:確定購物車中要提交的商品和
10、數量,然后點擊提交;-Then:訂單成功創建,從商品庫存中鎖定訂單的數量,訂單日志需要記錄這筆訂單創建,最后提示氣泡“商品已保存成功”-And when:如果訂單的數量超過商品庫存中可以鎖定的數量-Then:訂單無法成功提交,提示氣泡“庫存數量不夠,僅剩X件”需要拆分時堅持使用事件進行服務間交互Mediator拓撲架構Broker拓撲架構打開冰箱,塞進大象,關上冰箱04 把大象塞進冰箱分幾步把需求落地需要幾步把領域故事轉換成代碼轉碼用事件風暴劃分業務邊界劃界用實現細節編寫領域故事透視創建訂單服務收到命令后,會把創建訂單命令轉換成訂單,然后調用訂單倉庫進行保存,保存成功后會讓事件發布器發布訂單已創建事件 THANK YOU