為什麼DDD是設計微服務的最佳實踐

2021-09-03 05:39:06 字數 3570 閱讀 7068

在本人的前一篇文章《不要把微服務做成小單體》中,現在很多的微服務開發團隊在設計和實現微服務的時候覺得只要把原來的單體拆小,就是微服務了。但是這不一定是正確的微服務,可能只是乙個拆小的小單體。這篇文章讓我們從這個話題繼續,先看看為什麼拆出來的是小單體。

在微服務架構誕生之前,幾乎所有的軟體系統都是採用單體架構來構建的,因此大部分軟體開發者喜歡的開發路徑就是單體架構模式。在這樣的背景下,根據經濟學和心理學的路徑依賴法則,當這些開發者基於新的技術想要把原來的大單體拆分成多個部分時,就必然會習慣性地採用自己最擅長的單體架構來設計每個部分。

路徑依賴法則:是指人類社會中的技術演進或制度變遷均有類似於物理學中的慣性,即一旦進入某一路徑(無論是「好」還是「壞」)就可能對這種路徑產生依賴。一旦人們做了某種選擇,就好比走上了一條不歸之路,慣性的力量會使這一選擇不斷自我強化,並讓你輕易走不出去。第乙個使「路徑依賴」理論聲名遠播的是道格拉斯·諾斯,由於用「路徑依賴」理論成功地闡釋了經濟制度的演進,道格拉斯·諾斯於2023年獲得諾貝爾經濟學獎。

「路徑依賴」理論被總結出來之後,人們把它廣泛應用在選擇和習慣的各個方面。在一定程度上,人們的一切選擇都會受到路徑依賴的可怕影響,人們過去做出的選擇決定了他們現在可能的選擇,人們關於習慣的一切理論都可以用「路徑依賴」來解釋。

理解了這個法則,我們就可以很容易的明白,已經在單體架構下開發了多年的軟體工程師,當被要求要使用微服務架構來進行設計和開發的時候,本能的反應方式肯定是:這不就是把原來的單體做小了嗎?但是這樣做出來的「微服務」真的能夠給我們帶來微服務架構的那些好處嗎?真的能提高乙個企業的數位化響應力嗎?

不斷變化的軟體需求和經常被視為效率低下的軟體開發一直都是這個行業裡最難解決的頑疾,從瀑布到敏捷,都是在嘗試找到乙個解決這個頑疾的方法,領域驅動設計(domain driven design)也是其中乙個藥方,而且隨著十多年的不斷實踐,我們發現這個藥方有它自己的獨特之處,下面我們先來介紹一下這個藥方。

領域驅動設計這個概念出現在2023年,那個時候的軟體還處在從cs到bs轉換的時期,敏捷宣言也才發表2年。但是eric evans做為在企業級應用工作多年的技術顧問,敏銳的發現了在軟體開發業界內(尤其是企業級應用)開始湧現的一股思潮,他把這股思潮成為領域驅動設計,同時還出版了一本書,在書中分享了自己在設計軟體專案時採用的建模方法,並為設計決策者提供了乙個框架。

但是從那以後ddd並沒有和敏捷一樣變得更加流行,如果要問原因,我覺得一方面是這套方法裡面有很多的新名詞新概念,比如說聚合,限界上下文,值物件等等,要理解這些抽象概念本身就比較困難,所以學習和應用ddd的曲線是非常陡峭的。另一方面,做為當時唯一的「官方教材」《領域驅動設計》,閱讀這本書是乙個非常痛苦的過程,在內容組織上經常會出現跳躍,所以很多人都是剛讀了幾頁就放下了。

到了2023年,隨著各種分布式的基礎設施逐漸成熟,而soa架構應用在實踐中又不是那麼順利,martin fowler和james lewis把當時出現的一種新型分布式架構風潮總結成微服務架構。然後微服務這股風就呼呼的吹了起來,這時候軟體工程師們發現乙個問題,就是雖然指導微服務架構的應用具有什麼特徵,但是如何把原來的大單體拆分成微服務是完全不知道怎麼做了。然後熟悉ddd方法的工程師發現,由於ddd可以有效的從業務視角對軟體系統進行拆解,並且ddd特別契合微服務的乙個特徵:圍繞業務能力構建。所以用ddd拆分出來的微服務是比較合理的而且能夠實現高內聚低耦合,這樣接著微服務ddd迎來了它的第二春。

下面讓我們站在軟體工程這個大視角看看ddd究竟是在做什麼。

從計算機發明以來,人類用過表達世界變化的詞有:電子化,資訊化,數位化。這些詞裡面都有乙個「化」字,代表著轉變,而這些轉變就是人類在逐漸的把原來在物理世界中的乙個個概念乙個個工作,遷移到虛擬的計算機世界。但是在轉變的過程中,由於兩個世界的底層邏輯以及底層語言不一致,就必須要有乙個翻譯和設計的過程。這個翻譯過程從軟體誕生的第一天起就天然存在,而由於有了這個翻譯過程,業務和開發之間才總是想兩個對立的階級一樣,覺得對方是難以溝通的。

於是乎有些軟體工程界的大牛就開始思考,能不能有一種方式來減輕這個翻譯過程呢。然後就發明了物件導向語言,開始嘗試讓計算機世界有物理世界的物件概念。物件導向還不夠,這就有了ddd,ddd定義了一些基本概念,然後嘗試讓業務和開發都能夠理解這些概念名詞,然後讓領域專家使用這些概念名詞來描述業務,而由於使用了規定的概念名詞,開發就可以很好的理解領域業務,並能夠按照領域業務設計的方式進行軟體實現。這就是ddd的初衷:讓業務架構繫結系統架構。

後來發現這個方法不僅僅可以做好翻譯,還可以幫助業務劃分領域邊界,可以明確哪個領域是自己的核心價值所在,以後應該重點發展哪個領域。甚至可以作為組織進行戰略規劃的參考。而能夠做到這點,其實背後的原因是物理世界和虛擬世界的融合。

舉個例子,比如說在物理世界中要買乙個商品,在沒有商品的時候我需要乙個賬本來記錄有進了哪些商品,每乙個訂單買了多少商品,買乙個商品賺了多少錢。這些工作在計算機世界裡面也應該要有商品,賬本,訂單,訂單明細這些概念,而且當我說賣出商品需要能夠從賬本中扣除庫存的時候。在計算機世界裡面,就應該是訂單物件在完成以後會呼叫賬本物件來扣減庫存。通過這種方式,每乙個業務邏輯都可以很容易地找到軟體中對應的物件來進行實現。

上面介紹了使用ddd可以做到繫結業務架構和系統架構,這種繫結對於微服務來說有什麼關係呢。所謂的微服務拆分困難,其實根本原因是不知道邊界在什麼地方。而使用ddd對業務分析的時候,首先會使用聚合這個概念把關聯性強的業務概念劃分在乙個邊界下,並限定聚合和聚合之間只能通過聚合根來訪問,這是第一層邊界。然後在聚合基礎之上根據業務相關性,業務變化頻率,組織結構等等約束條件來定義限界上下文,這是第二層邊界。有了這兩層邊界作為約束和限制,微服務的邊界也就清晰了,拆分微服務也就不再困難了。

而且基於ddd設計的模型中具有邊界的最小原子是聚合,聚合和聚合之間由於只通過聚合根進行關聯,所以當需要把乙個聚合根從乙個限界上下文移動到另外乙個限界上下文的時候,非常低的移動成本可以很容易地對微服務進行重構,這樣我們就不需要再糾結應不應該這樣拆分微服務?拆出的微服務太少了以後要再拆分這樣的問題了。

所以,經過理論的嚴密推理和大量實踐專案的驗證,thoughtworks認為ddd是當前軟體工程業界設計微服務的最佳實踐。雖然學習和使用ddd的成本有點高,但是如果中國的企業想再軟體開發這個能力上從冷兵器時代進入熱兵器時代,就應該嘗試一下ddd了解一下先進的軟體工程方法。

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

隨著對充血模型的領域認知的加深,我越加感覺到ddd的重要性。於是網上一頓海找,並做了學習筆記。ddd內容繁多,個人淺見,它不同於傳統貧血的最核心的一點就是把原先傳統的貧血模型裡的業務邏輯層拎出來,融入到domain層,這樣面對複雜業務的規模化變更,我們只需要專注於domain即可。回到主題,我們要了...

DDD領域驅動設計 為什麼需要DDD

定義 在乙個孤立系統裡,如果沒有外力做功,其總混亂度 熵 會不斷增大。這裡面有三個詞非常重要 孤立系統 無外力做功 總混亂度 熵 首先我們來解釋什麼是 熵 熵 entropy 最早在1865年由德國物理學家克勞修斯提出,用以度量乙個系統 內在的混亂程度 你可以理解為,系統中的無性能量。比如物質總是向...

什麼是微服務,微服務簡介

目錄 微服務今天簡單了解一下微服務,在看微服務前,先了解一下傳統的單機系統。所有的業務子模組都集中在乙個系統中,優點是便於管理,但是規模變大的時候,缺點就很明顯了。缺點 當產品規模越來越大,各種的大大小小模組都塞在乙個專案中,必然會使整個專案變的臃腫,讓開發者難以維護。系統的各個功能模組都依賴於同樣...