1. 程式人生 > >【DDD】領域驅動設計實踐 —— 限界上下文識別

【DDD】領域驅動設計實踐 —— 限界上下文識別

團隊協作 協作 tin 組織 領域 ges 承擔 產品 進行

本文從戰略層面街上DDD中關於限界上下文的相關知識,並以ECO系統為例子,介紹如何識別上下文。限界上下文(Bounded Context)定義了每個模型的應用範圍,在每個Bounded Context中確保領域模型的一致性;上下文圖(Context Map)表示各個系統之間關系的總體視圖;通過持續集成(Continous Integration)確保多個限界上下文的模型統一。

限界上下文(Bounded Context)

限界上下文(Bounded Context)定義了每個模型的應用範圍,在每個Bounded Context中確保領域模型的一致性。不同的限界上下文中,領域模型可以不用保證一致性。通常我們根據團隊的組織、軟件系統的每個部分的用法及物理表現(如組件劃分,數據庫模式)來設置模型的邊界。

上下文圖(Context Map)

多個系統之間會發生關系,存在交互,這也必然會在各自的Bounded Context上有所表現。上下文圖(Context Map)便是表示各個系統之間關系的總體視圖。在Context Map中可以有如下幾種形式來表征限界上下文之間的關系,他們分別是:

共享內核(Shared Kernel)

當不同團隊開發一些緊密相關的應用程序時,團隊之間需要進行協調,通常可以將兩個團隊共享的子集剝離出來形成共享內核(Shared Kernel),雙方進行持續集成(Continuous Integration)。由此可見共享內核(Shared Kernel)是業務領域中公共的部分,同時也是團隊間容易達成且必須達成共識的領域部分。

客戶/供應商(Customer/Supplier)

不同系統之間存在依賴關系時,下遊系統依賴上遊系統,下遊系統是客戶,上遊系統是供應商,雙方協定好需求,由上遊系統完成模型的構建和開發,並交付給下遊系統使用,之後進行聯調、測試。這種模式建立在團隊之間友好合作和支持的情況下。

Conformist(追隨者)

如果上遊系統不合作,這時候“客戶/供應商”模式就不湊效了,那麽下遊系統只能去追隨上遊系統,下遊系統嚴格遵從上遊系統的模型,簡化集成。

例如在ECO系統中,社區服務的打賞記錄來源於支付系統,支付系統的打賞記錄這一模型設計較為友好,且社區服務只是一個簡單的查詢模型,可以直接追隨支付系統的打賞記錄模型,集成簡單快速。

防腐層(Anticorruption Layer)

如果上遊系統的模型不友好,不適合下遊系統的場景,但是下遊系統又必須依賴於這些模型,這時候我們需要使用防腐層(Anticorruption Layer)模式將上遊系統的影響降低。這種模式也是非常常見的,通常出現在系統間對接時,使用trasport+resolver的方式完成服務調用和協議轉換。其中的resovler便承擔了防腐的作用。

公開主機服務(Open Host Service)

公開主機服務(Open Host Service)能夠允許系統將一組service公開出去公其他系統訪問,在互通模型的同時,減少了系統間的耦合。

此類模式是使用最多的。系統之間的交互通常是使用該模式來完成的,而且現在很火的微服務架構也可以理解為此類模式的實現形式。

各行其道(Separate Way)

當兩個系統之間的關系並非必不可少時,兩者完全可以彼此獨立,各自獨立建模,獨立發展,互不影響。

模式圖譜

技術分享

思考

  綜合上述模式,由上而下耦合越來越低,模型的共享程度也越來越低,在實踐中,使用得最多的應當是:防腐層 + 公開主機服務的搭配使用。實際開發中,一個上遊系統會面對多個下遊系統做過多定制化的建模,且由於團隊組織和管理上的天然隔離,團隊合作的緊密度通常並不會那麽高,因此,要做到“共享內核”和“客戶/供應商”模式是比較困難的。我認為如今發展的如火如荼的微服務架構便是“防腐層 + 公開主機服務”的實現形式,使用RESTful契約公開主機服務,在業務模型上使用防腐層完成隔離和適配,達到共享模型和降低耦合的平衡。

  “共享內核”模式在通用業務領域較為常見,在細分業務領域中,通常由幾家廠商抽象出通用的業務模型,並產品化,售賣給各個甲方企業,在實施集成過程中,根據甲方的個性化訴求,在“共享內核”上做二次開發。比如在網上銀行這一細分的業務領域中,大小銀行的網銀系統基本上被科藍和宇信兩家公司承包,且兩家公司都已經產品化,具體項目實施時,只需要做一些二次開發,便可快速集成上線。

  “客戶/供應商”模式個人覺得實施起來會比較困難,畢竟是跨團隊協作,及時領頭上司是一個,如果這個關鍵人物不去把控系統設計,那麽業務模型上的一致性是很難保證的,最後估計會演變為“防腐層”模式;如果這個關鍵人物會實際參與到系統建模和設計中,那實際上編程了一個大的團隊了,也就無所謂“客戶/供應商”模式了,都是自己了。

在ECO系統中的實踐

結合上述理論知識,及實際實踐,我們發現ECO系統中主要使用到了:“追隨者”、“防腐層”、“公開主機服務”三種模式,他們的使用場景分別為:

  • ECO直接使用支付系統的“打賞記錄”模型作為其查詢模型,使用到了“追隨者”模式;
  • ECO訪問內容過濾服務,對內容過濾服務的訪問模型進行了適配,這裏使用到了“防腐層”模式;
  • ECO系統通過RESTful服務提供內網服務供其他業務系統內網訪問,比如積分系統獲取用戶的發帖/評論情況等,使用到了“公開主機服務”模式;

綜上,我們可以畫出ECO系統的Content Map,如下:

技術分享

【DDD】領域驅動設計實踐 —— 限界上下文識別