成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

領域驅動設計詳解:是什么、為什么、怎么做?

開發 開發工具
什么是領域驅動設計?傳統分層架構在實際開發中存在哪些問題?業務開發人員如何設計并搭建自己的領域模型?阿里文娛技術專家戰獒將為大家一一解答,并分享文娛在領域驅動設計上的實踐。

[[335227]]

什么是領域驅動設計?傳統分層架構在實際開發中存在哪些問題?業務開發人員如何設計并搭建自己的領域模型?阿里文娛技術專家戰獒將為大家一一解答,并分享文娛在領域驅動設計上的實踐。

一 什么是領域驅動設計

領域驅動設計的概念是2004年Evic Evans在他的著作《Domain-Driven Design : Tackling Complexity in the Heart of Software》(中文譯名:領域驅動設計:軟件核心復雜性應對之道)中提出的,從領域驅動設計提出距今已經有15年的時間,為什么最近才開始在中國的互聯網圈大行其道?似乎一夜之間大家都在談論,那么領域驅動設計到底幫我們解決了什么問題?帶著這些疑問,一起來看下阿里巴巴文娛是如何實踐領域驅動設計的。

二 領域驅動設計大行其道的必然原因

軟件系統從來都不是憑空而來,而是以軟件的形式解決特定的問題。當我們面臨現實世界的復雜問題時,如何以軟件的形式落地?領域驅動設計是一套方法論,指導我們將復雜問題進行拆分、拆分出各個子系統間的關聯以及是如何運轉的,幫助我們解決大型的復雜系統在落地中遇到的問題。

Evic Evans在著作中將軟件系統的設計分為2個部分:戰略設計和戰術設計。在戰略設計層面提出了域、子域、限界上下文等重要概念;在戰術設計層面提出了實體、值對象、領域服務、領域事件、聚合、工廠、資源庫等重要概念。如圖1所示:

 

圖1 戰略設計與戰術設計

戰略設計部分指導我們如何拆分一個復雜的系統,戰術部分指導我們對于拆分出來的單個子系統如何進行落地,在落地過程中應該遵循哪些原則。

以大家熟知的電子商務系統舉例,早期的電商系統因為業務相對簡單,用戶量和團隊規模也較小,一個單體應用就可以搞定,隨著容量上升可以將單體應用進行橫向擴容,比如早期的淘寶就是這樣做的。拆分過程中我們可以把電商系統這個單體應用拆分成訂單子系統、庫存子系統、物流子系統、搜索推薦子系統等等,如圖2所示:

 

圖2 電商系統微服務劃分

領域驅動設計在戰略層面上的域、子域、限界上下文的劃分思想和微服務的劃分不謀而合。域對應一個問題空間,也就是上例中的電商系統;子域是把域這個大的問題空間拆分成若干個小的更容易解決的問題空間,也就是單體應用向微服務演進過程中劃分出來的各個子系統;限界上下文是解決方案空間,每個子域對應一個或多個解決方案空間。微服務的劃分是也是將一個大的問題拆分成若干個小的問題,每一個小的問題用一個或多個微服務來解決。

對于大多數開發同學來說都沒有機會接觸系統的劃分,這些工作一般是公司的技術領導層與架構師來做的,普通的開發同學日常工作中接觸到的只是某一個具體微服務或微服務中某一個模塊的落地,那是不是說領域驅動設計對于普通開發同學來說就沒有用了?當然不是這樣,領域驅動設計中的戰術設計部分就是指導我們如何落地一個系統才可以使系統具備高可擴展性、高可讀性。

所有的系統最終都要以代碼的形式落地,而落地的工作都是由普通的開發同學來做的,系統是否具備高可擴展性、高可讀性直接影響了整個團隊的效率。

三 傳統分層架構存在的問題

對于大多數開發同學來說,大部分時間都花在落地一個個微服務上,下面我們來看阿里文娛是如何結合領域驅動設計的思想將微服務進行戰術落地的。

目前筆者接觸過的微服務大多數都是分層架構并且在Service層與Manager層實現具體的業務邏輯,使用DO、DTO、BO、VO等進行數據傳輸,數據和行為基本完全隔離。這種分層結構圖3是《Java開發手冊》中的標準分層結構。

該規范中定義了各層的職責,其中最重要的兩層Service層和Manager層是這樣規范的(以下兩層解釋摘抄自《Java 開發手冊》):

Service層

相對具體的業務邏輯服務層。

Manager層

通用業務處理層,它有如下特征:

  • 對第三方平臺封裝的層,預處理返回結果及轉化異常信息。
  • 對Service層通用能力的下沉,如緩存方案、中間件通用處理。
  • 與DAO層交互,對多個DAO的組合復用。

 

圖3 傳統的分層結構

阿里文娛早期的項目分層也基本都采用這種架構形式。上面的分層并沒有問題,但是這種分層架構采用的是包的形式進行的層與層的隔離,需要每一位開發同學理解并且自覺遵守以上規范,但是在實際工作中我們發現很多同學對Service層和Manager層的區別并不是特別的清楚,即使清楚的同學大部分也并沒有完全遵守手冊中的規范,這種現象導致Manager層除了沉底一些通用能力以外和Service層并沒有什么本質區別。

在實際的業務代碼中Service層和Manager層都充斥了大量的第三方依賴,對系統的穩定性有很大的影響。每依賴一個第三方服務都要各種異常問題,這些異常處理的代碼往往會和業務代碼混在一起,當這種代碼多了以后會使代碼的可讀性非常差。

阿里文娛業務的復雜度提升很快,業務迭代速度也很快, Service層和Manager層代碼量迅速膨脹,業務邏輯變得越來越復雜。在這種業務場景下,大文娛引入了領域驅動設計并設計了一套完整的領域驅動模型評估與演進的解決方案來輔助開發同學將領域驅動設計的思想真正的落地。

四 文娛領域驅動設計實踐

領域驅動設計的關鍵在于識別業務的模型,而模型又是會隨著業務的發展而演進的,對于新的業務來說能效平臺提供了業務模型分析的功能,開發同學可以在能效平臺設計并搭建自己的領域模型,搭建出來后能效平臺可以評估領域模型設計的是否合理,如果模型設計合理則可以基于以上設計的模型符合領域模型規范的代碼。對于已有應用,能效平臺設計了一套領域注解并以SDK的形式提供出去:

  • 第一步:開發同學按照領域設計的原則對業務代碼進行分析并打上注解。
  • 第二步:能效平臺可自動掃描該項目并收集該項目中的領域模型。
  • 第三步:模型收集后,開發同學可以在能效平臺改進業務模型并重新按照領域模型的規范生成代碼。

完整流程如下圖所示:

 

圖4 領域模型的生命周期

1 模型采集

對于已有的準備重構的應用,我們設計了一套領域模型的注解,開發同學可以將注解加到對應的類、屬性、方法上。當系統是按數據模型落地而不是按領域模型的方式落地時,可以先找到系統的數據模型,然后在能效平臺對數據模型進行組織生成領域模型。

 

圖5 領域模型注解

2 模型搭建

對于新應用或者已經進行完模型采集的應用,開發同學可以在能效平臺進行模型的搭建和修改,如圖6所示。

 

圖6 領域模型

3 健康度評估

對于已經搭建完的模型能效平臺,根據領域驅動設計的規范創建了一套完整的校驗規則,模型搭建完成在生成腳手架之前會根據校驗規則進行打分,當打分通過時可以將模型生成腳手架。

 

圖7 模型校驗

4 腳手架生成

當模型搭建完畢并且校驗通過后可以將模型生成腳手架,其代碼結構是按照六邊形架構的標準生成的,六邊形架構也成為端口與適配器架構,該架構的思想是將內部核心的領域邏輯與外界依賴進行隔離,這里的依賴是指所有對其他微服務的依賴、http的依賴、數據庫依賴、緩存依賴、消息中間件依賴等等,所有的這些依賴都通過適配器進行轉換成應用可理解可識別的最小化信息。

在實際的項目中,每種依賴都要考慮各種異常情況并進行處理,而這些處理實際上并不數據領域邏輯,卻耦合到了業務代碼里,當這種依賴多了對系統的穩定性會產生很大的影響,傳統的分層架構雖然也會讓我們將自身的領域邏輯和依賴進行分離,在阿里巴巴規范手冊中提到所有的依賴都應該放到Manager層,但是這種規范是非常容易被打破的。六邊形架構從應用分層上讓我們更容易去遵守這樣的規范。

 

圖8 六邊形架構

根據六邊形架構的指導思想,在實際的應用分層中一般劃分為四層,分別是:

  • 用戶接口層:負責用戶展現相關的邏輯。
  • 應用層:負責對一個用例進行流程編排(將接口用例分成若干個步驟,但是不負責每步的具體實施)。
  • 領域層:負責實現核心的領域邏輯即業務邏輯(負責實現具體的業務邏輯)。
  • 基礎設施層:所有依賴的具體實現。

但是從應用架構的角度看,層級組織形式可以分為兩種:

傳統分層架構

如圖9左側,這種分層架構是Evic Evans在《Domain-Driven Design : Tackling Complexity in the Heart of Software》中提出的,其中用戶接口層、應用層、領域層可直接依賴基礎設施層,與圖3的傳統架構并無本質區別,因為所有層都直接依賴了基礎設施層。這種方式需要強制開發同學將所有的依賴進行下沉,隨著時間的推移這種規范非常容易被打破。

 

圖9 層依賴關系

依賴倒置的分層架構

如圖9右側,這種分層架構是依賴倒置的分層架構,特點是:

  • 基礎設計層可直接依賴其他三層,反之則不行。
  • 用戶接口層、應用層、領域層如果要使用基礎設施層中的能力,只能通過IOC的方式進行依賴注入,這也遵從了面向對象編程中的依賴倒置原則。

當開發同學要在以上三層中直接引用第三方依賴時,是找不到具體的類信息的,也就是不能import。同時這種方式對單元測試的規范也可以起到很大的作用,當我們編寫單元測試時可以為領域層注入一個測試運行時的依賴,這樣應用運行單元測試可以不依賴下游服務,在代碼層面上也更加規范。

五 總結

 

經典的三層或多層架構雖然是目前最普遍的架構,但是在隔離方面做得并不夠好。在業務架構選型時要結合自身業務特點,而不能千篇一律的選擇某一種業務架構,合適的業務架構可以延長項目的生命周期,降低項目的重構頻率,最終達到降低人力成本的目的。

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2020-11-06 13:25:38

React Concu

2024-12-31 11:05:07

2022-05-27 20:53:42

數字化轉型數字化經營消費者

2023-07-29 22:27:44

2023-11-13 14:44:14

DDD開發Java

2019-10-14 13:20:26

物聯網數據IOT

2017-06-16 16:22:41

機房墻面

2017-10-25 09:50:51

Linux

2021-12-16 22:43:52

運營商手機號卡數據

2015-07-23 09:20:19

mmap

2018-01-08 14:18:14

代碼互聯網持續集成

2021-03-14 15:17:13

前端開發架構

2021-08-04 08:33:25

React服務端渲染

2018-02-07 00:00:00

數字化轉型

2025-02-11 09:51:52

2022-05-01 17:23:01

比特幣NFT數字資產

2018-08-02 15:24:05

RPCJava微服務

2011-08-04 10:18:45

數據驅動編程

2014-03-17 16:40:20

戴爾

2021-09-08 09:22:23

領域驅動設計
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区欧美| av午夜电影 | 国产精品一区二区三 | 久久精品成人 | 欧美日韩专区 | 男人天堂社区 | 久久欧美高清二区三区 | 久久国产成人 | 精品一区在线 | 91精品国产综合久久久久久漫画 | 欧美精品一区二区三区在线播放 | 成人免费影院 | 亚洲欧美在线一区 | 精品伊人久久 | 久久国内精品 | 亚洲人成人一区二区在线观看 | 日韩一区二区三区视频在线观看 | 日本成人在线观看网站 | 在线一区观看 | 一级片在线观看 | 午夜精品久久久久久久星辰影院 | 欧美日韩手机在线观看 | 欧美最猛黑人xxxⅹ 粉嫩一区二区三区四区公司1 | 亚洲成人自拍 | jizz亚洲人| 日韩欧美1区2区 | 天天天操 | 亚洲免费精品 | 国产一区二区影院 | 一区二区av | 国产ts人妖系列高潮 | 欧美精品一 | 日日噜噜噜夜夜爽爽狠狠视频97 | 亚洲在线| 九九免费视频 | 精品少妇一区二区三区日产乱码 | 久久网一区二区三区 | a黄视频 | av在线电影网站 | 在线观看成年人视频 | 精品中文字幕一区二区 |