《2018年端口和適配器架構-DDD好幫 .pdf》由會員分享,可在線閱讀,更多相關《2018年端口和適配器架構-DDD好幫 .pdf(26頁珍藏版)》請在三個皮匠報告上搜索。
1、端口和適配器架構 DDD好幫手DDD方法如何獲取經驗簡介01什么是端口和適配器架構02它可以帶來什么好處03與領域驅動設計的協同增效在接下來的40分鐘內,當我們在說架構時,我們在說什么什么是端口和適配器架構原來是這種“架構”單個應用代碼組織不是框架“經典”的層級架構Ports and AdaptersAllow an application to equally be driven by users,programs,automated test or batch scripts,and to be developed and tested in isolation from its even
2、tual run-time devices and databases.Alistair Cockburn 2005架構特征Ports and Adapters架構也被稱作六邊形架構什么是端口(Port)?Port是應用(Application)的出口和入口,它與其消費方及其實現方所使用的技術無關。在許多語言中,它以接口的形式存在兩種適配器(Adapter)?PrimaryorDriving Adapters:接收“用戶”指令,向應用發起請求(調用Port)SecondaryorDriven Adapters(最終)響應Driving Adapter的請求,輸出到外部設備或工具(實現Port)
3、它可以帶來什么好處“虛擬”案例DDD郵輪 DDD Cruise是一家中國的郵輪公司,正在研發新一代的預訂系統DDD郵輪MVP*多市場*全渠道*多數據源*One API中國出發 的消費者中國官網微信小程序亞洲官網Cruise 預訂引擎Legacy Booking SystemLoadHTTPAWS S3LoadFileUsesSearch CruisesSystem Context Diagram(C4模型)亞洲其他 地區消費者市場宣傳旅行社代售在線直銷可直銷數據其他數據UsesHeadless CMSLoadHTTP以Cruise Search為例,上“套路”API ControllerBus
4、iness LogicLegacy BookingCruise Source AdapterFileCruise Source AdapterPort=CruiseSourceX-DDD-CRUISE-APP-ID:7as0sfaGET/cruises/search?criteria=jsonPort=CruiseSearchDriving AdapterDriven AdapterPort=AppBasedCruiseCriteriaInjector促成簡單設計單一職責Simple=Do one thing=Easy獲取+解析數據獲取+解析數據與Spring Cache集成合并多數據源出口端
5、口入口端口實現Rest Endpoint(Spring MVC)篩選Cruise匹配各類 篩選條件Driving AdaptersPortsDriven AdaptersBusiness Logic落地測試策略ControllerTest/ContractTestCruiseSearchTestLegacyBookingCruiseSourceTestCachingCruiseSourceTestBusiness Logic TestDriving Adapter TestDriven Adapter TestE2E促進用戶故事分解 作為中文官網用戶,我應該可以找到所有非B2C渠道開放的郵輪
6、以便我聯系代售旅行社進行預訂 作為中文官網用戶,我可以按出發港口、日期等篩選郵輪,以便我可以快速找到心儀的郵輪 作為中文官網用戶,我應該還可以找到對B2C渠道開放的郵輪 以便我進行在線預訂LegacyBookingCruiseSourceComposite CruiseSourceCachingCruiseSourceBusiness LogicAPI ControllerCruiseSourceFileCruiseSourceCruiseSearchInMemory CruiseSearchInMemory CruiseSearch CruiseSearch API 對于80%的請求應該在
7、300ms內響應端口和適配器架構Driving AdapterDriven AdapterPort單一職責解析請求 生成響應與外部工具集成促進Ports&Adapters負責負責調用入口實現出口由組成可測試性技術實現 易于替換持續演進由組成由組成意味著促進促進促進促進最小可用產品促進促進與領域驅動設計的協同增效由于概念簡單、易于掌握,端口和適配器架構很適合作為DDD的入門輔導工具 而領域驅動設計的諸多方法也能夠補充端口和適配器架構的空白,形成合力校驗通用語言 作為中文小程序用戶 我希望看到所有遺留預訂系統的郵輪 領域知識丟失,充斥著實現細節 可能誤導設計,萬一技術實現變化?領域知識、業務規則得
8、到保留 將技術細節交給開發者處理開發團隊:中文小程序上可以展示哪些郵輪業務負責人:所有從遺留預訂系統來的郵輪都可以,目前該系統返回的郵輪都是從中國出發的,而且支持B2C預訂 開發團隊:理解,那么中文官網呢?業務負責人:這會復雜一些,一部分也是來自遺留預訂系統,除此之外,它還需要展示由旅行社代售的郵輪開發團隊:好的,那我們從哪里可以得到這些郵輪?業務負責人:這有些麻煩,目前還沒有辦法直接由某個系統提供這些數據,但我可以從內部系統中導出一份Excel表格,你覺得這可行嗎?開發團隊:不是很理想,但我們可以解析這份表格,等有更成熟的來源時再替換 作為中文官網用戶 我希望看到保存在AWS S3上的Exc
9、el中的郵輪 作為中文小程序用戶 我希望看到所有從中國出發且對B2C開放的郵輪 作為中文官網用戶 我還希望由旅行社代售的郵輪端口與適配器架構和領域驅動設計都強調業務邏輯與技術實現的隔離API ControllerJpa XXXRepositoryRabbit EventPublisherDriving AdaptersMessage ListenerHTML TemplateDriven AdaptersXXX DomainService作為DDD戰術設計的腳手架DDD書中的“架構”DDD(2004)Ports and Adapters(2005)Interfaces =Driving Ada
10、pters Infrastructure =Driven Adapters Application+Domain=Business Logic 戰術設計 在此起效Application+DomainApplication 是關于用例/用戶故事的 (入口端口)Domain是關于規則/知識 (入/出口端口)以上兩者可能是聲明式的DDD Cruise中應用戰術設計Identified ByarriveAtdepartureItinerarylegsIdentified ByBelong ToUsesUsesApplicationServiceDomainModelSpecification Patt
11、ernCruise CatalogLegacy Booking SystemCruise ContentApp RegistryObject Storage此處也應 由端口隔離,適配器集成 讓DDD戰略設計補充隔離場景限界上下文識別防腐層隔離不同限界上下文端口隔離技術實現特化的DDD Cruise中應用防腐層(一)UsesLegsCabinsImagesImagesUses未隔離 Cruise Search、Cruise Content限界上下文DDD Cruise中應用防腐層(二)UsesLegsUsesCruise Search 限界上下文UsesCruise Content 防腐層Use
12、s協同增效Driving AdapterDriven AdapterPortDDD戰術設計Ports&Adapters應該被排除比更好地解釋了Business Logic應該被排除調用入口實現入口由組成由組成由組成DDD戰略設計通用語言支撐是的一個重要實踐構造塊補充了的架構組成了防腐層支撐加入是一種特化的限界上下文是一種.的集成方式DDD是.的一種方法核心是.的一種方法補充了端口的隔離場景回顧01什么是端口和適配器架構02它可以帶來什么好處03與領域驅動設計的協同增效Allow an application to equally be driven by users,programs,automated test or batch scripts,and to be developed and tested in isolation from its eventual run-time devices and databases.1.通過促進單一職責、可測試性支持、易于替換技術實現 持續演進 2.概念簡單、有效,易于學習兩者都強調隔離實現細節 1.快速識別技術實現,檢查通用語言 2.戰略設計用防腐層補充了端口的使用場景 3.澄清了戰術設計中的架構,戰術設計則細化了業務邏輯設計THANK YOU