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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM