一文搞懂企業架構與DDD的融合
在當今數字化時代,企業架構(EA)和領域驅動設計(DDD)成為了構建高效、靈活且可擴展軟件系統的關鍵方法論。本文將深入探討企業架構TOGAF框架與DDD的融合之道,分析如何通過這種結合實現從業務戰略到技術實現的無縫對接。
今天聊聊企業架構與DDD如何進行融合。
一、企業架構TOGAF
什么是企業架構TOGAF?
TOGAF(The Open Group Architecture Framework)是一個廣泛采用的企業架構(Enterprise Architecture, EA)框架,由開放組(The Open Group)開發和維護。
它為組織設計、規劃、實施和治理企業信息架構提供了系統化的方法和工具。TOGAF旨在幫助企業通過高效的架構管理,實現業務目標、優化資源利用和增強靈活性。
TOGAF發展歷程
如圖展示了從1970年代至2012,企業架構框架和相關標準的演進歷程,其中包括:
- C4ISR (Command, Control, Communications, Computers, Intelligence, Surveillance and Reconnaissance)
- TAFIM (Technical Architecture Framework for Information Management)
- Zachman Framework
- TOGAF (The Open Group Architecture Framework)
- FEAF (Federal Enterprise Architecture Framework)
- DoDAF (Department of Defense Architecture Framework)以及ArchiMate
在此歷程中,美國各組織和政府部門陸續制定并優化了各自的企業架構方法論和標準,攜手推動了企業架構領域的蓬勃發展。
1970年啟動的C4ISR計劃為軍事和政府架構提供了架構理論基礎。
1986年開始研發的TAFIM和1987年提出的Zachman框架,標志著企業架構實踐開始走向系統化。
1993年,The Open Group成立并著手制定系統標準,隨后在1995年發布TOGAF 1.0,為商業領域提供了通用的企業架構開發框架。
1996年,美國聯邦政府頒布了里程碑式的克林格·科恩法案,要求政府機構(特別是國防部和財政部)采用企業架構理論構建IT系統。這項法案為政府機構的數字化轉型注入強勁動力,顯著提升了其信息化水平。
1997年,C4ISR升級為AF 2.0版本。1999年,聯邦企業架構FEAF問世,為政府跨部門整合提供了方法論支持。
進入2000年,TOGAF相繼發布7.0版本(2001年)和8.0版本(2002年),持續完善其架構開發方法。同期,政府部門推出DoDAF(2003年發布1.0版)和FEA相關方法(2002年起持續更新),兩者形成了良性互動。
2006至2008年間,FEA-PMO陸續發布FTF、EAAF3.0等成果,DoDAF也更新至1.5版。
2009年,The Open Group發布TOGAF 9,為企業架構領域帶來更系統、更靈活的方法體系。同期,DoDAF在2010年更新至2.02版。
2011年,TOGAF 9.1的發布進一步優化了框架內容,使架構師能更順暢地應用這一方法論。
為滿足日益增長的架構可視化和建模需求,The Open Group于2008年接管ArchiMate的研發工作,并在2012年發布ArchiMate 2.0,為企業架構的表達和溝通提供了統一的建模語言。
在2022年,TOGAF正式發布了10版本,這是一次重大更新。TOGAF 10在保持核心框架穩定的同時,增強了靈活性和適應性,更好地支持數字化轉型和敏捷開發等現代企業需求。
TOGAF通過吸收政府機構在企業架構實踐中積累的豐富經驗,不斷完善和沉淀,最終發展成為一套通用且系統化的企業架構方法論。
這套方法論不僅適用于政府機構,還能廣泛應用于各類企業和組織。目前,福布斯前50強企業中有80%采用TOGAF理論,美國500強企業中有60%使用這一方法論來優化和改進其IT架構。
這些數據有力地證明了TOGAF在企業架構領域的權威性和實用價值,同時也凸顯了企業架構理論在現代組織管理和IT治理中的重要地位。
在TOGAF理論中,有四種核心視圖:業務架構、應用架構、數據架構和技術架構。
這四個架構視圖構成了企業整體架構的核心。雖然各視圖關注點不同,但它們相互聯系、相互支撐,共同構建了完整的企業架構體系。如圖2-3所示。
業務架構
業務架構定義了企業如何將其業務戰略轉化為結構化的、全面的、多維度的抽象模型。這些模型包括價值流、業務能力、業務流程、業務對象和組織架構,同時描述了它們與企業戰略、產品、策略、項目執行以及利益相關者之間的關系。
應用架構
應用架構描述了企業內應用系統的結構、行為和相互關系,以及這些系統如何支持業務流程。它既關注單個應用的架構設計,也注重應用系統間的協作方式,確保所有系統能夠協同運作,有效支撐企業目標。
數據架構
數據架構明確定義企業的數據管理方式,包括數據的收集、存儲、管理和使用。它包括數據模型設計、數據庫技術選型,以及數據治理機制的建立與實施。
技術架構
技術架構描述了支撐企業業務、數據和應用服務所需的IT基礎設施和技術組件結構,包括硬件設施、軟件包、網絡系統、技術中間件、通信設備和計算資源等。
二、企業架構與DDD融合
在前文中,我們已經了解了TOGAF企業架構的四大視圖,它們共同構成了一個完整的企業架構框架。
接下來,我們將深入探討領域驅動設計(DDD)這一重要方法論,以及它如何與企業架構協同工作來解決復雜的業務問題。
通過了解DDD的核心概念和應用方式,我們將看到它如何幫助組織更有效地實現從業務戰略到技術實現的轉化。
1. DDD是什么
大多數人初次接觸領域驅動設計(DDD)時,通常會閱讀Eric Evans的《領域驅動設計》。這本書被譽為DDD的”圣經”,但許多讀者看完后往往感到困惑,覺得內容深奧難懂。
DDD旨在實現軟件系統與業務的緊密對接,提高開發效率和質量,同時更好地應對復雜性和變化。它將業務置于核心地位,通過深入把握領域知識并建立有效的領域模型,來指導軟件設計和開發過程。
具體而言,DDD的核心理論包括:
- 分治思想:DDD應對復雜性的核心理念是”分而治之”。它將復雜的業務領域劃分為較小的子域,并在每個子域中明確上下文邊界和核心實體等要素。通過這種系統化的分解、分類和推導過程,最終形成最優解決方案。
- 領域建模:DDD的核心在于將業務流程抽象化,通過定義領域實體、領域服務和領域事件等要素來滿足業務需求。作為貫穿整個軟件生命周期的方法論,領域模型讓開發人員、產品經理和架構師能夠基于統一的模型進行設計和討論,確保項目始終保持正確方向。
- 架構分層:DDD采用清晰的分層架構,將應用程序分為用戶接口層、應用層、領域層和基礎設施層四個主要層次。每一層都具有明確的職責和功能定位。這種分層架構使業務領域的結構更加清晰、有序。
- 事件驅動:領域事件是一種跨領域的交互機制,負責在不同模塊之間傳遞信息。通過事件的發布與訂閱機制,不僅使領域模型更加簡潔,還實現了系統間的低耦合。
2. DDD與架構視圖
在4大架構視圖(業務架構、應用架構、數據架構、技術架構)和DDD的落地過程中,存在2個問題:
- 1. 在業務領域劃分環節,DDD 未提供明確的領域劃分指導,如何進行合理的領域劃分?
- 2. 如何基于業務架構合理劃分應用系統結構和抽象數據模型?
業務架構與DDD方法論的融合能有效解決這兩個問題。
端到端的業務流程包含多個業務場景,每個場景都需要依賴不同的業務能力。通過對業務能力進行分層抽象,我們可以識別出各個層次的業務能力,這為領域和子域的劃分提供了重要依據。
在應用架構設計階段,需要對應用系統結構進行劃分。應用是一個可獨立發布和部署的單元,可提供一個或多個應用服務。在這一過程中,DDD中的限界上下文為劃分應用結構提供了有效依據:
- 當業務復雜度高、用戶規模大且團隊規模大時,應用系統需要拆分為微服務,以實現獨立部署和維護。這種情況下,通常一個限界上下文對應一個微服務。
- 相比之下,當應用系統面向企業內部用戶時,由于用戶規模較小,通常不需要分布式架構。這類應用宜采用較大顆粒度劃分,將多個相關的限界上下文整合在一個應用中,以減少系統調用并降低部署復雜性。
在數據模型設計過程中,DDD的核心概念為數據建模提供了重要指導:
- 聚合根定義了數據訪問的邊界,作為一組相關對象的統一入口。
- 領域實體是具有唯一標識的業務對象,體現了核心業務概念。
- 值對象則是通過其屬性來定義的對象,它不需要概念上的唯一標識。
這些模型元素共同構成了一個豐富的業務概念框架,指導數據模型的設計,確保數據模型能準確反映業務領域的復雜性和內在邏輯。通過將這些概念應用到數據建模中,我們可以創建出更貼合業務需求、結構清晰、易于維護的數據模型。
3. DDD帶來的價值
DDD為企業帶來多方面價值,包括提升團隊協作效率、沉淀業務能力和優化技術實現。讓我們從以下關鍵方面深入了解DDD在實踐中的具體價值與優勢:
1、統一語言
業務、產品、設計和技術團隊使用統一的業務術語進行溝通。無論是日常交流、設計討論、文檔編寫、圖表繪制還是代碼開發,都采用同一套標準化語言,大幅提升了工作效率。
2、團隊協作高效
通過系統化地識別和分類需求,將其劃分為清晰的領域、子域和限界上下文,能有效指導團隊分工協作,避免職責混亂。這種劃分可以防止任務錯配,例如將原本屬于技術團隊A的任務,錯誤分配給團隊B。也能避免兩個團隊重復開發同一功能,造成資源浪費。
3、領域能力沉淀
業務能力的可復用性是衡量軟件架構設計質量的關鍵指標。通過建立業務知識與模型之間的統一映射關系,并持續驗證和優化這些模型,我們能確保它們準確反映當前業務狀況。這種方式讓業務知識能夠通過模型得到有效傳承,讓團隊新成員能夠準確理解業務邏輯。
4、業務與技術有效融合
傳統開發方式過分注重數據庫表結構設計,卻忽略了業務模型。DDD則采用相反的策略——先抽象業務領域模型,再據此設計數據庫結構。這種方法讓業務與技術真正融合,克服了傳統開發中只關注數據層和接口層的局限性。
4. DDD的缺點
盡管DDD在構建復雜軟件模型方面具有顯著優勢,但這套方法論也存在一些明顯的局限性。
1.學習曲線陡峭
DDD包含了限界上下文、實體、值對象、聚合和領域事件等一系列復雜概念和實踐。掌握這些概念需要投入大量時間和精力,對初學者或習慣簡單開發模式的團隊來說尤其具有挑戰性。
2.過度設計的風險
團隊在運用DDD概念時,容易陷入過度設計的陷阱。為了完美實現領域模型,可能會構建過于復雜的層次結構和關系,導致”充血模型”泛濫,甚至演變成”高血壓模型”。這不僅增加了項目的復雜度,還會顯著提高開發和維護成本。
3.實施成本和時間
DDD的正確實施需要投入大量時間和資源進行領域建模,同時要求與業務方保持密切溝通。這種特性在項目初期可能會放慢開發進度,特別是對需要快速交付的短期項目來說,會帶來較大壓力。
4.不適用于所有項目
DDD主要適用于業務邏輯復雜、需要長期發展和維護的大型軟件項目。對于業務簡單或生命周期較短的項目,使用DDD反而會帶來不必要的復雜性和額外投入,因此并不適合。
5. DDD的核心概念
為DDD的完整設計流程,DDD的核心理念由兩個關鍵部分構成:戰略設計和戰術設計。
戰略設計專注于宏觀層面的領域分析和邊界劃分,而戰術設計則著重于微觀層面的領域模型實現。
領域和子域
領域指的是特定的業務范圍或問題域。在運用DDD解決業務問題時,會將業務領域細分,并將問題限定在特定邊界內。在這個邊界內,DDD建立領域模型,并通過代碼實現這些模型來解決相應的業務問題。這種方法的核心思想是”分而治之”。
領域可以進一步劃分為子域,每個子域對應一個更小的問題域或業務范圍。DDD本質上是一種處理復雜領域的設計方法,它通過持續細分將復雜的業務簡化,使其更易理解和實現。
這種方法類似于公司的組織結構。以一家互聯網創業公司為例,它包含產品研發部、市場營銷部、客戶服務部等部門。領域就像公司的一個大部門,比如產品研發部,負責產品的設計與研發,主導公司的產品方向和策略。
子域則類似于大部門下的小團隊。例如,產品研發部門下設有產品團隊、前端團隊、后端團隊和測試團隊。每個子域團隊專注于具體職能任務,共同支撐上級部門的目標。這種分層確保每個部門、團隊和小組都有明確的職責,讓公司運作更加有序高效。
同理,在DDD中,通過劃分領域和子域,軟件研發團隊能更好地理解和處理復雜的業務需求。各個層級雖關注不同細節,但通過協作完成整個系統的開發。
核心域、通用域和支撐域
在領域劃分過程中,子域可根據其重要性和功能屬性分為核心域、通用域和支撐域。
核心域決定產品和公司的核心競爭力,通用域是多個子域共用的功能域,支撐域則負責支持業務運轉,但既不直接影響核心競爭力,也不包含通用功能。
劃分這三類域的主要目標是聚焦關鍵事項。通過這種劃分,公司能夠清晰區分不同子域的重要性,從而更有效地分配資源和關注度,在激烈的市場競爭中保持優勢。
以電商領域為例,主要子域包括商品、訂單、用戶、支付、物流、客服和數據分析。
在電商領域中,核心域直接關系到業務的核心價值和主要收入,主要包括:
- 商品子域:負責管理商品信息,包括展示、分類、搜索和推薦等功能,構成電商平臺的基礎。
- 訂單子域:負責訂單的創建、修改、查詢和狀態管理等,是交易流程的關鍵環節。
- 支付子域:負責支付交易處理,包括支付方式管理、狀態跟蹤和渠道對接等,是完成交易的核心環節。
- 物流子域:負責商品配送管理,包括物流公司對接和配送狀態跟蹤等,確保商品準確送達消費者。
- 客服子域:提供客戶支持服務,包括咨詢和投訴處理等,解決用戶使用過程中的問題。
通用域支持多個業務領域的運作:
- 用戶子域:負責用戶信息管理,包括注冊、登錄和資料編輯等。雖然用戶管理在多個系統中都很重要,但在電商系統中主要是支持核心業務流程。
支撐域為核心域提供支持,主要涉及決策分析支撐:
- 數據分析子域:負責業務數據分析,包括用戶行為和銷售數據分析等,為決策制定和業務優化提供支持。
限界上下文
在DDD中,限界上下文(Bounded Context)是對一個特定業務邊界內的概念和規則進行統一管理的范圍。它將領域模型的適用范圍、業務語言以及規則約束都界定在一個相對獨立的“上下文”中,以避免概念在不同業務場景間的混用或沖突。
在一個復雜系統里,不同業務子域可能對同一個名詞或實體有各自的含義和處理邏輯。若不加區分,容易出現命名混亂、邏輯沖突等問題。通過劃分限界上下文,可以讓團隊在各自的上下文內部使用統一的“業務語言”,保持模型的一致性與完整性。
在限界上下文之間,通常還需要定義清晰的協作關系和數據交換方式。例如通過上下文映射(Context Map)來確定上下文之間的接口、依賴以及團隊之間的協同策略。這樣可以最大程度減少跨上下文溝通帶來的復雜度,也讓每個上下文能獨立演進。
例如在電商平臺中,“訂單”一詞在“支付”上下文和“倉儲”上下文可能包含不同的信息和規則。支付上下文關注付款狀態、交易金額等,倉儲上下文關注庫存、物流等。把它們劃分到不同的限界上下文,可以讓每個上下文的“訂單”實體都針對自己需要的領域規則進行優化,避免混淆。
實體
實體是具有唯一標識的對象。即使實體的其他屬性發生變化,只要其標識(如ID)保持不變,它就仍被視為同一個實體。實體在系統中代表持續存在的業務對象。實體具有以下關鍵特征:
- 標識性:每個實體都有唯一標識,通常通過ID或編碼實現。
- 連續性:實體在其生命周期內可能經歷多種狀態變化,但標識始終保持不變。
- 區分性:即使兩個實體的所有非標識屬性完全相同,只要標識不同,它們就是不同的實體。
以電商平臺的訂單系統為例,每個訂單實體都有唯一的訂單號。即使訂單的屬性(如商品、數量)或狀態(如已付款、已發貨)發生變化,只要訂單號相同,它就仍然是同一個訂單。
值對象
值對象是描述事物狀態或屬性的對象,它沒有唯一標識,且通常不可變。值對象用于表示對象的某個特征,無需獨立身份,僅為更完整地描述實體。值對象的關鍵特征包括:
- 無標識:值對象沒有唯一標識。它們通過屬性值定義,通常作為實體的一部分存在。
- 不可變性:一旦創建,值對象的屬性就不應被修改。若需改變,應創建新的值對象。
- 替換性:由于沒有唯一標識,值對象可被具有相同屬性的另一個值對象完全替代。
舉例來說,訂單中的收貨地址(包含省、市、街道和郵編)是值對象,因為它沒有獨立標識,僅描述了一個地理位置。
同樣,訂單的支付金額(包括數字和貨幣單位)也是值對象,因為它只描述了價值的數量,本身不需要獨立存在。
聚合與聚合根
在DDD中,聚合是一個核心概念,它幫助開發者管理復雜度,尤其是在處理大量相關對象時。聚合由緊密關聯的實體和值對象組成,是修改和保存數據的基本單位。每個聚合都有一個倉庫,用于保存其數據。
聚合包含一個聚合根和上下文邊界。邊界根據業務需求和內聚原則,定義了聚合應包含的實體和值對象。聚合之間保持松耦合,這種設計自然地實現了微服務的高內聚、低耦合特性。
在DDD分層架構中,聚合是領域層的一部分。領域層可包含多個聚合,共同實現核心業務邏輯。實體在聚合內采用充血模型實現業務能力,確保業務邏輯的高內聚。
跨多個實體的業務邏輯通過領域服務實現,而跨多個聚合的業務邏輯則通過應用服務來實現。
聚合根可以類比為部門負責人,既是實體,也是聚合”部門”的管理者。作為實體,它擁有自身的屬性和業務行為,執行特定的業務邏輯。作為管理者,它在聚合內部會協調實體和值對象,完成業務邏輯。
而在聚合間的協作中,聚合根充當對外接口人。它通過自身ID關聯其他聚合,接收外部請求。訪問聚合內其他實體時,必須先經過聚合根,再導航至內部實體,外部對象無法直接訪問聚合內的實體。
領域服務
領域服務用于處理實體、值對象或聚合無法獨立完成的業務邏輯。它專門封裝跨實體或跨聚合的復雜邏輯。領域服務僅包含純業務邏輯,不直接涉及數據庫操作、消息隊列等具體技術實現。
需要將領域服務與應用服務區分開來。應用服務位于應用層,主要負責調用外部系統和協調多個領域對象的流程。而領域服務則專注于領域內部的業務規則計算。領域服務具有以下特征:
- 跨聚合或跨實體邏輯:當業務邏輯需要使用多個聚合的數據或操作,適合將其放在獨立的領域服務中。
- 聚焦業務邏輯:理想情況下,領域服務應只依賴領域模型中的接口或抽象模型,而不關注具體的數據庫、網絡調用等基礎設施細節。這樣可以保持領域邏輯的純凈性和可測試性。
領域事件
在DDD中,領域事件(Domain Event)是一個核心概念。它表示業務領域中發生的重要事件,這些事件由具體業務行為觸發,例如用戶注冊、訂單生成或支付完成。領域事件反映了業務流程中的關鍵狀態變更,對流程的進展具有重大影響。
領域事件在軟件開發中發揮著關鍵作用,其重要性主要體現在以下幾個方面:
1)微服務解耦
領域事件是微服務架構中實現服務解耦的有效工具。通過將直接調用轉換為異步消息傳遞,它降低了服務間的緊密依賴,提高了系統的靈活性和可維護性。
2)數據一致性保障
在分布式系統中,數據一致性維護是一項重大挑戰。領域事件通過記錄業務操作,使系統即使在發生故障時也能通過重放事件來恢復狀態,從而增強了系統的容錯能力。
3)系統可追溯性
領域事件為系統提供了完整的歷史變更記錄。通過存儲和追蹤這些事件,我們能夠清晰地了解系統狀態的演變過程,這對故障排查、系統優化和業務分析都具有重要價值。
4)促進業務理解
作為領域模型的重要組成部分,領域事件反映了業務領域中的關鍵變化。通過識別和捕獲這些事件,開發者能夠更深入地理解業務規則和邏輯,同時加強研發人員與業務人員之間的有效溝通與協作。
6. DDD分層架構
DDD分層架構是對傳統三層架構的優化升級,形成了四層結構。如圖2-6所示,這四層從上到下分別是:用戶接口層、應用層、領域層和基礎設施層。
1、用戶接口層
負責管理系統與用戶的交互。它接收用戶輸入(如表單數據或操作),并將應用層的處理結果通過Web頁面或移動應用界面呈現給用戶。
2、應用層
應用層處理業務用例和流程相關的操作,理論上不應包含業務規則或邏輯。它位于領域層之上,負責協調多個聚合的服務和領域對象,完成服務的編排與組合。
應用層需保持簡潔,開發時應避免在此放置領域層的業務邏輯。若應用層過于復雜,可能導致領域模型失焦,使微服務退化為傳統三層架構,致使業務邏輯混亂。
3、領域層
領域層是系統的核心,負責封裝業務概念、邏輯和規則。它執行核心業務邏輯,并通過各種校驗確保業務的準確性。領域層包含聚合根、實體、值對象和領域服務等領域模型對象。
4、基礎設施層
基礎設施層為其他層提供技術支持和基礎服務,包括數據庫、文件系統、消息中間件和緩存等。
本文由人人都是產品經理作者【湯師爺】,微信公眾號:【架構師湯師爺】,原創/授權 發布于人人都是產品經理,未經許可,禁止轉載。
題圖來自Unsplash,基于 CC0 協議。
- 目前還沒評論,等你發揮!