當前位置:吉日网官网 - 傳統節日 - 為什麽DDD是設計微服務的最佳實踐?

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

在我之前的文章《不要把微服務做成小單體》中,現在很多微服務開發團隊都認為只要把原來的單體拆了就是微服務。但這不壹定是正確的微服,可能只是壹個小單體。本文我們從這個話題繼續,先來看看為什麽是小單體。

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

現實中,我們經常看到這個規律在各地發生。微信剛出來的時候,很多人說只是手機上的QQ。朋友圈剛出來的時候會說只是抄襲微博。很多時候,當妳興致勃勃的給朋友介紹壹個新事物的時候,朋友的壹句話就能讓妳覺得無可救藥:這不是XXX嗎?之所以會這樣,是因為人在接觸到新知識、新概念的時候,會下意識地套用以前知道的概念。這種思維方式是人們從小學習新事物時使用的模式,它已經固化為我們大腦操作系統的壹部分。

了解了這個規律,我們就很容易理解,當多年在單壹架構下開發的軟件工程師被要求使用微服務架構進行設計開發時,他們的本能反應壹定是:這不就是把原來的單壹變小了嗎?但是這樣做出來的“微服務”真的能給我們帶來微服務架構的那些好處嗎?真的能提高企業的數字化響應能力嗎?

經常被認為效率低下的軟件需求變化和軟件開發,壹直是這個行業最難解決的問題。從瀑布到敏捷,我們都在努力尋找這個問題的解決方案。領域驅動設計也是藥方之壹,而且經過十幾年的不斷實踐,我們發現這個藥方有自己的獨特之處。先介紹壹下這個方子。

領域驅動設計的概念出現在2003年,當時軟件還處於CS到BS的過渡期,敏捷宣言也是兩年前才發表的。然而,作為壹名在企業應用領域工作多年的技術顧問,Eric Evans敏銳地發現了壹種在軟件開發行業(尤其是企業應用)已經開始出現的思潮。他將這種趨勢轉變為領域驅動設計,還出版了壹本書,在書中他分享了他在設計軟件項目中的建模方法,並為設計決策者提供了壹個框架。

然而,從那以後,DDD就沒有像敏捷那樣受歡迎了。如果要問原因,壹方面是這個方法中出現了很多新的術語和概念,比如聚合、綁定上下文、值對象等。這些抽象的概念很難理解,所以學習和應用DDD的曲線非常陡峭。另壹方面,《領域驅動設計》作為當時唯壹的“官方教材”,讀起來是壹個非常痛苦的過程,內容組織上經常有跳轉,所以很多人只是看了幾頁就放下了。

雖然入門門檻有點高,但是對於喜歡智力挑戰的軟件工程師來說,這是壹個難度稍微高壹點的玩具,所以在壹個小群體中,壹群人逐漸能夠掌握這個玩具,並利用它來指導設計能夠控制業務復雜度的軟件應用。盡管當時大多數軟件應用程序都是單壹的,但DDD仍然可以用來設計易於維護和快速響應需求變化的單壹應用程序。

到了2013年,隨著各種分布式基礎設施的逐漸成熟,SOA架構的應用在實踐中並不那麽順利,馬丁·福勒和詹姆斯·劉易斯把當時出現的新壹波分布式架構總結為微服務架構。然後微服之風就吹起來了。這時軟件工程師發現了壹個問題,那就是雖然有壹些特性來指導微服務架構的應用,但是如何將原來的單體拆分成微服務卻是完全未知的。然後熟悉DDD方法的工程師發現,DDD可以有效地從業務角度拆解軟件系統,而DDD特別適合微服務的壹個特性:圍繞業務能力進行構建。因此,DDD對微服務的拆分是合理的,可以實現高內聚、低耦合,從而使微服務DDD迎來了第二個春天。

讓我們從軟件工程的角度來看看DDD在做什麽。

自從計算機發明以來,人類就用文字來表達世界的變化:電子化、信息化、數字化。這幾個字裏有壹個“華”字,代表著變化,而這些變化就是人類逐漸在物理世界裏壹個接壹個地工作,向虛擬的計算機世界遷移。但是在轉換的過程中,因為兩個世界的底層邏輯和語言不壹致,所以必須有壹個翻譯和設計的過程。這種翻譯過程從軟件誕生的第壹天起就自然存在,也因為這種翻譯過程,業務和開發總覺得對方像兩個對立的階級壹樣難以溝通。

於是壹些軟件工程領域的大牛開始思考是否有辦法緩解這種翻譯過程。然後我發明了面向對象語言,開始嘗試讓計算機世界擁有物理世界的對象概念。面向對象是不夠的,所以有DDD,它定義了壹些基本概念,然後試圖讓業務和開發理解這些概念術語,然後讓領域專家使用這些概念術語來描述業務。由於使用了特定的概念術語,開發可以很好地理解領域業務,並以領域業務設計的方式實現軟件。這就是DDD的初衷:讓業務架構綁定系統架構。

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

上面描述了DDD可以用於綁定業務架構和系統架構。這個綁定和微服務有什麽關系?所謂微服務拆分難,其實根本原因是不知道邊界在哪裏。在使用DDD分析業務時,會使用聚合的概念將相關性強的業務概念劃分在壹個邊界下,聚合和聚合只能通過聚合根來訪問,聚合根是第壹個邊界。然後在聚合的基礎上,根據業務相關性、業務變化頻率、組織結構等約束定義邊界上下文,這是第二個邊界。有了這兩層邊界作為約束和限制,微服務的邊界就清晰了,拆分微服務不再困難。

而且基於DDD的模型中最小的有邊界的原子是聚合,聚合和聚合只通過聚合根聯系在壹起,所以當壹個聚合根需要從壹個有界的上下文移動到另壹個上下文時,微服務可以很容易地以非常低的移動成本重構,所以我們不需要擔心微服務是否應該這樣拆分。拆除的微服務太少,以後再拆分這個問題。

因此,經過嚴格的理論推理和大量實際項目的驗證,ThoughtWorks認為DDD是當前軟件工程行業設計微服務的最佳實踐。雖然學習和使用DDD的成本有點高,但是中國的企業如果想在軟件開發方面從冷兵器時代向熱兵器時代轉變,應該嘗試DDD學習先進的軟件工程方法。

  • 上一篇:中小企業財稅政策國內外研究現狀
  • 下一篇:數學、物理等知識。由九個環節使用。
  • copyright 2024吉日网官网