DDD領域驅動設計架構模式:防腐層(Anti-corruption layer)

Rickie發表於2021-07-10
在微服務(Microservices)架構實踐中,架構設計借用了DDD中的一些概念和技術,比如一個微服務對應DDD中的一個限界上下文(Bounded Context);在微服務設計中應該首先識別出DDD中的聚合根(Aggregate Root);還有在微服務之間整合時採用DDD中的防腐層(Anti-Corruption Layer, ACL)。
本文介紹了防腐層相關的概念和應用場景。
 
一、防腐層(Anticorruption Layer)簡介
防腐層(Anticorruption Layer):一個上下文透過一些適配和轉換與另一個上下文互動。
DDD領域驅動設計架構模式:防腐層(Anti-corruption layer)
防腐層是一種在不同應用間轉換的機制。建立一個防腐層,以根據客戶端自己的領域模型為客戶提供功能。該層透過其現有介面與另一個系統進行通訊,幾乎不需要對其進行任何修改。
 
在不共享相同領域模型的不同子系統之間實施防腐層(或外觀或介面卡層),此層轉換一個子系統向另一個子系統發出的請求。 使用反腐層(Anti-corruption layer)模式可確保應用程式的設計不受限於對外部子系統的依賴。 反腐層(Anti-corruption layer)模式最先由 Eric Evans 在 Domain-Driven Design(域驅動的設計)中描述。
 
因此,防腐層隔離不僅是為了保護自身領域模型免受其他領域模型的程式碼的侵害,還在於分離不同的域並確保它們在將來保持分離。
 
二、防腐層應用場景
在以下情況下,可以考慮使用防腐層。
(1)舊版單體應用遷移到新版微服務系統,但是遷移計劃發生在多個階段,新舊系統之間的整合需要維護。
大多數應用程式依賴於其他系統的某些資料或功能。 例如,舊版應用程式遷移到新版應用系統時,可能仍需要現有的舊的資源,新功能必須能夠呼叫舊系統。逐步遷移功能尤其如此,隨著時間推移,較大型應用程式的不同功能遷移到新式系統中。
DDD領域驅動設計架構模式:防腐層(Anti-corruption layer)
這些舊系統通常會出現質量問題,如複雜的資料架構或過時的 API。舊系統使用的功能和技術可能與新版微服務系統中的功能和技術有很大差異。 若要與舊系統進行互操作,新應用程式可能需要支援過時的基礎結構、協議、資料模型、API、或其他不會引入新版應用程式的功能。
 
此時的解決方案是:在不同的子系統之間放置防腐層以將其隔離。此層轉換兩個系統之間的通訊,在一個系統保持不變的情況下,使另一個系統可以避免破壞其設計和技術方法。
下圖顯示了新版微服務應用系統和老版單體應用直接的呼叫過程,在不同的系統之間放置了防腐層以將其隔離。
DDD領域驅動設計架構模式:防腐層(Anti-corruption layer)
新舊系統都擁有自身的領域模型,防腐層包含了兩個系統之間轉換所必需的所有邏輯。
 
(2)兩個或更多不同的子系統(或限界上下文)具有不同的領域模型,需要對外部上下文的方法進行一次轉義。
兩個限界上下文之間的關係方向由術語上游(UpStream)和下游(DownStream)描述。
下圖是採用無防腐層的設計,圖中限界上下文Statistics和OrderProcess都使用相同的領域模型。
DDD領域驅動設計架構模式:防腐層(Anti-corruption layer)
 
下圖採用有防腐層的設計,限界上下文Shipping在訪問限界上下文Legacy時,使用了ACL(防腐層),這兩個限界上下文都有自己獨立的領域模型。
這樣確保Legacy系統中的領域模型不會影響到Shipping限界上下文,Shipping系統可以在其限界上下文中實現乾淨的領域模型。
DDD領域驅動設計架構模式:防腐層(Anti-corruption layer)
從上圖中,我們可以看出防腐層的作用:
1)在架構層面,透過引入防腐層有效隔離限界上下文之間的耦合;
2)防腐層同時還可以扮演介面卡、調停者、外觀等角色;
3)防腐層往往屬於下游限界上下文,用以隔絕上游限界上下文可能發生的變化;

相關文章