領域、子域、核心域、通用域以及支撐域,是不是讓人一頭霧水,完全分不清誰是誰?
DDD 的知識體系包含眾多名詞,如領域、子域、核心域、通用域、支撐域、限界上下文、聚合、聚合根、實體、值對象等。這些都是關鍵概念,但由于比較晦澀難懂,可能會讓人們在還沒開始實踐 DDD 時就望而卻步。因此,在基礎篇中,我們要做好實踐前的準備工作。
需要注意的是,在微服務設計和開發過程中,不一定會用到所有這些名詞,但它們有助于理解 DDD 的核心設計思想和理念。而這些思想和理念,在 IT 戰略設計、業務建模和微服務設計中都具有借鑒意義。
從這部分內容開始,我們將圍繞這些 DDD 關鍵概念進行講解,幫助大家理清它們與微服務的關系,以及它們在微服務設計中的作用。今天重點了解領域、子域、核心域、通用域和支撐域等重要概念。
如何理解領域和子域?
首先看領域的定義。漢語詞典中解釋領域是從事一種專門活動或事業的范圍、部類或部門,百度百科則解釋為一種特定的范圍或區域。這兩個解釋的共同點是 “范圍”,這也是 DDD 在設計中強調邊界的原因。
在研究和解決業務問題時,DDD 會按照一定規則對業務領域進行細分。當細分到一定程度后,就會在特定邊界內建立領域模型,并用代碼實現該模型來解決業務問題。簡單來說,DDD 的領域就是在這個邊界內要解決的業務問題域。
由于領域是用來限定業務邊界和范圍的,所以它有大小之分,領域越大,業務范圍就越大。
領域可以進一步劃分為子域,劃分出來的多個子域分別對應更小的問題域或更小的業務范圍。
DDD 是處理高度復雜領域的設計思想,它旨在分離技術實現的復雜度。面對復雜的業務領域,DDD 使業務變得簡單且易于理解、技術實現更容易的方法與自然科學研究類似。在自然科學研究中,遇到復雜問題時,通常會將問題逐步細分,然后針對細分后的問題域逐個深入研究,建立子域的知識體系。當所有子域的研究完成后,就形成了整個領域的完整知識體系。
我們來看上面的圖,圖中的例子是關于如何為桃樹構建完整的生物學知識體系,初中生物課就提到了這種研究方法,其研究過程如下:
一、確定研究對象(研究領域)研究對象是一棵桃樹,這相當于 DDD 中的研究領域。
二、對研究對象進行細分(劃分子域)將桃樹細分為器官,器官又分為營養器官(根、莖、葉)和生殖器官(花、果實、種子)。桃樹整體的知識體系就是要研究的問題域(對應 DDD 的領域),而根、莖、葉、花、果實和種子這些器官就是細分后的問題子域(類似于 DDD 將領域劃分為子域的過程)。
三、進一步細分器官(子域再細分)例如把葉子這個器官細分為保護組織、營養組織和輸導組織等,這相當于 DDD 中將子域進一步細分的過程。
四、細分組織為細胞(確定最小單元)將組織細分為細胞,細胞是研究的最小單元,細胞之間的細胞壁確定了研究的最小邊界。
并且,細胞核、線粒體、細胞膜等物質構成細胞,這些物質協同作用使細胞具備特定生物功能。這里可以把細胞看作 DDD 中的聚合,細胞內的這些物質看作聚合中的聚合根、實體和值對象等,在聚合內這些實體協作完成特定業務功能,這類似 DDD 設計中確定微服務內功能要素和邊界的過程。
總結來說,每個細分的領域都有一個知識體系,即 DDD 的領域模型。當完成所有子域的研究后,就能建立全域的知識體系和全域的領域模型。
以上用自然科學研究方法說明了通過將領域細分為子域可以降低研究復雜度,接下來將切換到保險行業(作者所從事行業)來對比驗證二者細分過程是否一致。
保險是一個較為龐大的領域。在早期,保險核心系統采用單體系統來實現所有功能。然而,隨著保險業務的發展,單體系統逐漸無法滿足需求,于是保險公司開始進行中臺轉型,采用分布式微服務架構來取代單體系統。在分布式微服務架構下,需要劃分業務領域邊界、建立領域模型并實現微服務落地。
為了對保險領域進行建模和建設微服務,可以依據業務關聯程度以及流程邊界,把保險領域細分為承保、收付、再保、理賠等子域。其中,承保子域還能夠進一步細分為投保、壽險的保全、財險的批改等子子域。
在投保這個限界上下文當中,可以構建投保的領域模型,而這個投保的領域模型最終會映射到系統中,形成投保微服務。這就是保險領域細分和微服務建設的流程。
或許你會覺得,如果你不是保險行業的從業者,很難理解這個過程。但實際上,盡管不同行業的業務模型可能各異,然而領域建模和微服務建設的流程與方法大體上是相似的。其核心要點在于逐步分解問題域,從而降低業務理解和系統實現的難度。
如何理解核心域、通用域和支撐域?
在領域持續細分的進程中,領域會分化出各式各樣的子域,而依據子域自身的重要性以及功能特性,可將其歸為三大類別:核心域、通用域和支撐域。
核心域堪稱重中之重,它是決定產品及公司核心競爭力的關鍵所在,承載著業務成功的關鍵要素,凝聚著公司獨一無二的核心競爭力,是企業脫穎而出的制勝法寶。
通用域,所涵蓋的是那些缺乏鮮明個性化訴求,卻能被多個子域頻繁共用的通用功能子域,它為不同子域提供標準化、通用性的服務,使得整體業務流程更為順暢高效。
支撐域同樣不可或缺,它屬于一種功能性子域,雖然不具備決定產品和公司核心競爭力的關鍵功能,也并非通用功能,但卻是維持業務正常運轉必需的基礎支撐部分。
對比這三類子域,核心域的地位無疑最為突出,后續在闡述相關目的時,還會以核心域為典型進行詳盡剖析。要是將通用域和支撐域對應到企業系統中來舉例說明的話,通用域就好比企業日常運營中所需用到的通用系統,像認證、權限管理這類應用,市面上隨處可見,幾乎不受企業特定屬性的限制,購買后稍作調整甚至無需定制化就能直接投入使用。而支撐域則帶有鮮明的企業個性特征,不具備廣泛通用性,諸如數據代碼類的數據字典等系統,專為企業自身特定的數據管理需求而打造。
那為什么要劃分核心域、通用域和支撐域,主要目的是什么呢?
咱們還是以上圖中的桃樹為例。之前,我們把桃樹細分成了根、莖、葉、花、果實和種子這六個子域,那桃樹到底有沒有核心域呢?要是有的話,究竟哪個才是呢?
要知道,不同的人看待桃樹的視角各異。假設這棵桃樹長在公園里,在園丁的眼中,他們盼著陽春三月能呈現 “人面桃花相映紅” 的美景,此時,花就成了桃樹的核心域。可要是桃樹扎根在果園里,果農心心念念的是在豐收季收獲沉甸甸、碩果累累的桃子,這樣一來,果實便當之無愧地成為桃樹的核心域。
很明顯,處于不同場景,人們對桃樹核心域的理解截然不同,相應地,對桃樹的照料方式也大不一樣。園丁會著重關注桃樹花期所需的營養,果農卻更聚焦于桃樹落果期的營養補給,有時為了保障果實有充足的養分,甚至會剪掉那些瘋長的莖和葉,而這些莖和葉就類似于通用域或支撐域。
同理,公司在進行 IT 系統建設的時候,鑒于預算和資源往往有限,對于不同類型的子域,自然得采取不同的關注度與資源投入策略,畢竟要懂得好鋼用在刀刃上。
許多公司的業務乍一看頗為相似,實則商業模式與戰略方向存在天壤之別,這就使得公司的關注點有所不同,進而在劃分核心域、通用域和支撐域時,結果也會大相徑庭。
就拿電商平臺來說,淘寶、天貓、京東和蘇寧易購同屬電商范疇,可商業模式卻各有千秋。淘寶是典型的 C2C 網站,也就是個人賣家面向個人買家;天貓、京東以及蘇寧易購屬于 B2C 網站,即公司賣家對接個人買家。即便蘇寧易購與京東都采用 B2C 模式,二者的商業模式也不盡相同,蘇寧易購是由傳統線下賣場華麗轉身成為電商,京東則是直營結合部分平臺的運營模式。
正是由于商業模式的差異,才導致核心域的劃分結果千差萬別。有些公司的核心域或許聚焦于客戶服務,有些可能側重于產品質量,還有些可能鎖定在物流環節。所以,公司在進行領域細分、構建領域模型以及推進系統建設時,務必要緊密結合公司的戰略重點與商業模式,精準找出核心域,并且著重予以關注。
倘若你的公司恰好有意向轉型微服務架構,我在此建議你和你的技術團隊,務必將核心域的建設擺在首位,最好能具備絕對的掌控能力與自主研發能力。要是資源實在緊缺,不妨在支撐域或者通用域上動動腦筋,暫時采用外購的方式也不失為一種可行之舉。
領域的核心理念在于把問題域層層拆解,一步一步細分下去,以此降低業務理解方面的難度,同時也讓系統實現起來更加簡便易行。借助這種領域細分的手段,能夠逐步收窄微服務需要應對的問題范疇,進而構建出契合實際需求的領域模型。而一旦將領域模型投射到實際系統當中,就轉化成了微服務。
再看核心域、支撐域以及通用域,它們存在的主要目的是:利用領域劃分這一方式,清晰界定出不同子域在公司內部所具備的各異功能特性以及重要程度。如此一來,公司便能依據這些差異,針對各個子域制定不一樣的資源投入計劃與建設方案,在關注程度上自然也會有所區分。