微服務拆分-防腐層模式 1 定義 2 上下文和問題 3 解決方案 4 優點 5 問題 6 相關模式 7 應用場景

1 定義

防腐層(Anti-Corruption Layer)模式,是一種在不同語義的子系統間構建一層功能,對子系統間的請求進行翻譯適配,從而確保應用設計不受外部依賴的系統的限制。此模式最初由Eric Evans在《領域驅動設計》中提出。

2 上下文和問題

許多應用依賴於其它系統提供的數據或者功能。當直接使用外部系統的API、數據結構或者其他語義時,本應用系統就存在因使用外部系統,而被外部系統的質量問題影響,從而“腐化”本身設計的問題。比如,當一個遺留應用需要移植到新系統時,可能仍需使用現存的遺留資源,新的特性需要調用遺留系統。這種場景在大型應用隨時間推移緩慢向新系統遷移過程中尤其普遍。

遺留系統通常存在API過時、數據結構複雜等質量問題;或者遺留系統使用的特性和技術與新系統存在很大的不同。爲了與遺留系統交互,新應用可能需要支持過時的基礎架構、數據結構、API,或者使用根本不期望在新應用中使用的特性。如果新系統強行遵守遺留系統的API或其他語義,則新系統原本簡潔清晰的設計很可能被遺留系統的質量問題 “腐化”。

此外,當開發團隊對接無法控制的外部系統時,也會存在類似的問題。一種可行的方法,就是在應用系統自身與外部系統之間,構築專門一層組件或者服務,對兩個系統進行通訊轉換和語義隔離。這一層組件或者服務,稱爲“防腐層”。

3 解決方案

爲解決某系統依賴其他系統功能、數據結構或者其他語義而引入“腐敗”的問題,可在兩個系統之間放置一個獨立的層來進行隔離,防止對方系統帶來的“腐敗”,這一層就是“防腐層”。防腐層實現兩個系統之間通訊的轉換,允許一個系統保持不變,又能避免另一個系統對其設計和技術實現進行折中。

如上圖所示的引入了防腐層的架構中:

  • 子系統A與防腐層之間的通訊,使用子系統A的數據模型和架構;

  • 子系統B與防腐層之間的通訊,則使用子系統B的數據模型和方法;

  • 防腐層實現了在兩個系統之間進行通訊轉換的全部邏輯(雙向轉換)。

防腐層可實現爲應用中的組件,或者獨立的服務。

4 優點

防腐層兩方的系統解耦,隔離雙方變更的影響,允許雙方獨立演進;防腐層允許其它的外部系統能夠在不改變現有系統的領域層的前提下,與該系統實現無縫集成,從而降低系統集成的開發工作量。

5 問題

  • 防腐層可能增加兩個系統間的通訊延遲;

  • 防腐層增加了額外的服務,需要管理和維護;

  • 防腐層需要考慮如何擴展;

  • 考慮是否構建多個防腐層:可能的原因比如:將防腐層的功能解耦爲多個服務,各個服務使用不同技術、語言進行開發。

  • 確保維護事務和數據一致性,並且可被監控;

  • 考慮防腐層是否需要處理所有的系統間通訊,還是隻需處理一個子集;

  • 如果防腐層是系統遷移戰略的一部分,則需要考慮防腐層是否是永久的,是否在遺留系統功能完全遷移完成後將其移除。

6 相關模式

  • Facade API模式:

    Facade API模式關注於系統功能如何對使用者友好的呈現;而防腐層則關注於隔離不同架構系統間的影響,使各個系統可獨立演進。

    在系統架構遷移場景下使用的防腐層,通常是臨時存在的。當系統遷移完成後,防腐層就沒有了存在的必要。而Facade API的生命週期依賴系統的外部使用者,只要外部用戶存在,Facade層就應存在;如果外部用戶變更,則Facade層則需要一起變更,以適配用戶新的要求。

    防腐層需要提供兩個系統間的數據結構轉換和接口適配,因此比API Facade“胖”。而API Facade只建議簡單的提供接口給用戶,不建議增加較多的邏輯,它應該是“瘦”的。

  • 適配器模式:

    適配器目的是解決差異接口的對接,接口轉換是單向的(即從調用方向被調用方進行接口轉換);防腐層強調兩個子系統語義解耦,接口轉換是雙向的。

7 應用場景

漸進式架構遷移,需要維護遺留系統和新系統之間的集成;具有不同語意環境和架構的兩個或者多個系統,且彼此需要通訊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章