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

為什么在做微服務設計的時候需要DDD?

開發 架構
隨著對充血模型的領域認知的加深,我越加感覺到DDD的重要性。

[[313881]]

 

記得之前在規劃和設計微服務架構的時候,張隊長給了我一個至今依然記憶深刻的提示:『你的設計藍圖里為什么沒有看到DDD的影子呢?』

隨著對充血模型的領域認知的加深,我越加感覺到DDD的重要性。

但是DDD內容繁多,是不是要深入去了解呢,我覺得不必入坑太深,個人淺見,它最核心的一點就是針對貧血模型的不足而設計,把原先傳統的貧血模型里的業務邏輯層拎出來,融入到Domain層,這樣面對復雜業務的規模化變更,我們只需要專注于Domain即可。

回到主題,我們要了解的是微服務和DDD到底有什么關系呢?

因為在互聯網時代,軟件所面臨的問題域比以往要復雜得多,這種復雜性來源于不斷擴展的問題域自身,也來源于創新變化,以及這種規模性增長所帶來的挑戰。

然而一個人一個團隊,他對復雜的事物的認知是有極限的,面對這種復雜問題唯一的方法就是分而治之。

分主要考慮的是如何去分;治意味著分出來的每一個部分要能夠獨立的運行,能夠互相的協作,完成整體的目標,能夠一來應對外部變化所帶來的沖擊。

微服務的缺陷

微服務架構在分和治兩個方面都給出了很好的理論指導和最佳實踐,那微服務是不是解決復雜問題的銀彈呢?

其實不然,很多團隊在應用了微服務架構來構建他們的系統以后,發現并沒有完全解決這種復雜性問題,甚至還帶來了一些其他的問題。比如:

  • 服務并沒有解決復雜系統如何應對需求變化這個問題,甚至還加劇了這個問題。
  • 當一個需求變化了,需要花大量的精力去識別這個變化影響到了哪些微服務,這些服務的多個團隊之間,需要通過無休止的扯皮去決定哪個服務多一些,哪些服務少改一些。
  • 然后測試團隊還需要做昂貴的這種聯調測試
  • 即便如此呢,開發團隊依然不放心,還要通過一系列的開關控制,小心翼翼的去做切流,去做灰度發布。

從業務層面來看,微服務架構沒有避免這種散彈式的修改。甚至反而加重了他,這是為什么呢?一個重要的原因是微服務架構在分的這個緯度考慮的并不全面。

DDD功用

當我們去做分的這種工作的時候,具體拆分詳見我的另外一篇文章《微服務的拆分姿勢》,需要考慮哪些維度呢?

我覺得我們至少要考慮三個維度:

  • 功能緯度
  • 質量緯度,比如性能,可用性
  • 工程緯度

微服務對第2個給出了很好的指導,對第3個也給出了一些建議。但是,對第1個功能緯度只給出來非常有限的指導,就是為什么隨著微服務的流行,領域驅動設計(DDD)又被重新重視起來的原因。

DDD彌補了微服務在功能劃分方面沒有給出很好指導的缺陷。所以他們在面對復雜問題和構建系統時候是一種互補的關系,在系統拆分的時候可以很好的協作。

只是他們看待系統拆分這個角度是不同的。微服務當中的服務所關注的范圍正是DDD所推崇的六邊形架構中的領域層。

 

 

 

 

拆分案例

接下來結合DDD和微服務來拆分一個復雜系統。

關于領域

我們稱企業的業務范圍和在這個范圍里進行的活動為領域,和軟件系統無關。領域會分成多個子域,比如我們一個電商系統,會有:

  • 商品子域
  • 訂單子域
  • 庫存子域等等。

在不同的子域里,不同的概念有不同的含義。

所以我們在進行領域建模的時候,必須要有一個明確的領域邊界,也就是DDD里稱做的限界上下文,它是系統內部的一個架構邊界,決定了這個系統架構。

劃分系統內部架構邊界

架構簡潔之道這本書里邊就說過:『系統架構是由系統的內部架構邊界以及邊界之間的依賴關系所決定的,與系統中各個組件之間的通信和調用的方式是無關的』。

我們常說的微服務的服務調用本身只是一種比函數調用方式成本稍高的,分割應用程序行為的一種形式,系統架構無關。

所以,復雜系統劃分的第一重要的是要劃分內部的架構邊界,即劃分清楚這個上下文,以及明確他們之間的關系,這對應于我們之前說的功能的維度。這正是DDD用武之處。

其次我們才考慮基于非功能的維度如何劃分,這是微服務能夠發揮其優勢的地方。

舉個例子,我們把系統分成ABC三個個上下文,三個上下文的代碼可以在一個部署單元里運行,通過進程內調用來完成操作,這就是典型的單體架構;

 

 

也可以各自在一個獨立的部署單元里運行,通過遠程調用來完成操作,這就是現在流行的微服務架構。

 

 

邊界清晰的好處

我們更多的是兩種架構模式的一個混合,比如A和B一起是一個部署單元,C是另外一個獨立的部署單元,這種情況往往是因為C非常重要,他并發的訪問量非常大,或者它的需求變更比較頻繁。

將C拆分出來的有以下幾個好處:

  • 資源傾斜
  • 使用彈力設計模式:比如重試,熔斷,降級
  • 使用特殊技術:比如Go語言
  • 具備獨立代碼庫:有獨立團隊和運維人員,和A和B的運行期做到隔離不互相影響

這四點正是服務架構所關注的,它是基于非功能緯度的視角來看待拆分這件事情的,他關注的不是系統架構的邏輯邊界,更多的關注的是應用程序行為的分隔。

那為什么不把A和B都拆成一個獨立的部署單元?

這會帶來更多的好處,也會帶來額外的成本,架構應該是可以演進的,在業務發展的早期,應該關注系統架構的邏輯邊界,保持邏輯邊界的清晰和關系的正確,隨著業務量的增加,逐步在做拆分,這是組合應用DDD和微服務架構帶來的最大的好處。

在單體架構中,保持架構邏輯邊界不被突破是有一定難度。如果邏輯邊界不清晰,在需要服務器拆分的時候,就未必能拆得出來了。

另外沒有人一下子就可以把邏輯邊界定義正確,即使這個上下文定義的不太正確,在DDD聚合根這個概念可以保障我們能夠演進出更適合的上下文。

DDD界限上下文內部通過實體和值對象來對領域概念進行建模,一組實體和值子對象歸屬于一個聚合根。那按DDD要求

  • 聚合根用來保證內部實體規則的正確性和數據的一致性
  • 外部對象只能通過ID來引用聚合根,不能引用聚合根內部的實體
  • 聚合根之間不能共享一個數據庫事務,它們之間的數據一致性需要通過最終的一致性來保障

有了聚合根,基于這些約束,未來可以根據需要把聚合根升級為上下文,甚至拆分成微服務都是比較容易的。

另外想要知道如何合理的拆分微服務,可以參考我的另外一篇文章《微服務劃分的姿勢》,今天就給你介紹到這兒,希望對你有所啟發。

責任編輯:武曉燕 來源: 博客園
相關推薦

2020-07-10 15:18:12

微服務設計模型

2022-11-30 08:27:26

微服務設計服務

2024-12-31 11:05:07

2016-01-20 09:54:51

微服務架構設計SOA

2023-01-11 16:22:07

2022-05-25 08:00:00

開發微服務企業

2021-08-03 07:21:14

架構微服務開發

2021-11-15 11:05:27

DDD微服務Java

2017-08-18 14:47:31

DDD微服務架構

2023-11-24 07:16:10

DDD微服務

2023-12-19 07:56:08

微服務軟件測試左移測試

2023-11-13 14:44:14

DDD開發Java

2022-03-25 10:09:17

用戶分層APP設計

2020-04-21 11:03:34

微服務數據工具

2024-09-04 17:49:27

2023-03-29 15:01:43

微服務開發

2022-09-27 15:06:07

微服務架構開發

2022-08-29 10:35:42

微服務架構單體應用

2023-09-15 12:30:06

微服務架構管理

2021-07-26 08:10:24

微服務單體架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产999精品久久久久久 | 久久久综合色 | 成人av网站在线观看 | 亚洲免费在线视频 | 欧美亚洲视频在线观看 | www.操com| 国产精品综合一区二区 | 中文字幕91 | 欧美精品网站 | 91精品国产色综合久久不卡蜜臀 | 草久在线 | 久久99精品国产自在现线小黄鸭 | 日韩精品在线看 | 亚洲免费观看视频 | 亚洲第一福利视频 | 日韩有码一区二区三区 | 日韩精品免费播放 | 亚洲第一网站 | 国产a视频 | 日韩高清一区 | 四虎伊人 | 久久精品99 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 亚洲区中文字幕 | 国产伊人精品 | 亚洲视频中文字幕 | 午夜精品一区二区三区在线视 | 亚洲喷水 | 视频一区二区三区中文字幕 | 国产福利精品一区 | 天堂网avav | 美女久久| 成人精品国产 | av中文字幕在线观看 | 一区二区视频 | 97伦理| 国产精品久久久久久 | 欧美日韩不卡合集视频 | 国产精品91网站 | 夏同学福利网 | 日韩中文字幕视频在线观看 |