1 定義
防腐層(Anti-Corruption Layer)模式,是一種在不同語義的子系統(tǒng)間構(gòu)建一層功能,對子系統(tǒng)間的請求進行翻譯適配,從而確保應(yīng)用設(shè)計不受外部依賴的系統(tǒng)的限制。此模式最初由Eric Evans在《領(lǐng)域驅(qū)動設(shè)計》中提出。
2 上下文和問題
許多應(yīng)用依賴于其它系統(tǒng)提供的數(shù)據(jù)或者功能。當直接使用外部系統(tǒng)的API、數(shù)據(jù)結(jié)構(gòu)或者其他語義時,本應(yīng)用系統(tǒng)就存在因使用外部系統(tǒng),而被外部系統(tǒng)的質(zhì)量問題影響,從而“腐化”本身設(shè)計的問題。比如,當一個遺留應(yīng)用需要移植到新系統(tǒng)時,可能仍需使用現(xiàn)存的遺留資源,新的特性需要調(diào)用遺留系統(tǒng)。這種場景在大型應(yīng)用隨時間推移緩慢向新系統(tǒng)遷移過程中尤其普遍。
遺留系統(tǒng)通常存在API過時、數(shù)據(jù)結(jié)構(gòu)復(fù)雜等質(zhì)量問題;或者遺留系統(tǒng)使用的特性和技術(shù)與新系統(tǒng)存在很大的不同。為了與遺留系統(tǒng)交互,新應(yīng)用可能需要支持過時的基礎(chǔ)架構(gòu)、數(shù)據(jù)結(jié)構(gòu)、API,或者使用根本不期望在新應(yīng)用中使用的特性。如果新系統(tǒng)強行遵守遺留系統(tǒng)的API或其他語義,則新系統(tǒng)原本簡潔清晰的設(shè)計很可能被遺留系統(tǒng)的質(zhì)量問題 “腐化”。
此外,當開發(fā)團隊對接無法控制的外部系統(tǒng)時,也會存在類似的問題。一種可行的方法,就是在應(yīng)用系統(tǒng)自身與外部系統(tǒng)之間,構(gòu)筑專門一層組件或者服務(wù),對兩個系統(tǒng)進行通訊轉(zhuǎn)換和語義隔離。這一層組件或者服務(wù),稱為“防腐層”。
3 解決方案
為解決某系統(tǒng)依賴其他系統(tǒng)功能、數(shù)據(jù)結(jié)構(gòu)或者其他語義而引入“腐敗”的問題,可在兩個系統(tǒng)之間放置一個獨立的層來進行隔離,防止對方系統(tǒng)帶來的“腐敗”,這一層就是“防腐層”。防腐層實現(xiàn)兩個系統(tǒng)之間通訊的轉(zhuǎn)換,允許一個系統(tǒng)保持不變,又能避免另一個系統(tǒng)對其設(shè)計和技術(shù)實現(xiàn)進行折中。

如上圖所示的引入了防腐層的架構(gòu)中:
子系統(tǒng)A與防腐層之間的通訊,使用子系統(tǒng)A的數(shù)據(jù)模型和架構(gòu);
子系統(tǒng)B與防腐層之間的通訊,則使用子系統(tǒng)B的數(shù)據(jù)模型和方法;
防腐層實現(xiàn)了在兩個系統(tǒng)之間進行通訊轉(zhuǎn)換的全部邏輯(雙向轉(zhuǎn)換)。
防腐層可實現(xiàn)為應(yīng)用中的組件,或者獨立的服務(wù)。
4 優(yōu)點
防腐層兩方的系統(tǒng)解耦,隔離雙方變更的影響,允許雙方獨立演進;防腐層允許其它的外部系統(tǒng)能夠在不改變現(xiàn)有系統(tǒng)的領(lǐng)域?qū)拥那疤嵯?,與該系統(tǒng)實現(xiàn)無縫集成,從而降低系統(tǒng)集成的開發(fā)工作量。
5 問題
防腐層可能增加兩個系統(tǒng)間的通訊延遲;
防腐層增加了額外的服務(wù),需要管理和維護;
防腐層需要考慮如何擴展;
考慮是否構(gòu)建多個防腐層:可能的原因比如:將防腐層的功能解耦為多個服務(wù),各個服務(wù)使用不同技術(shù)、語言進行開發(fā)。
確保維護事務(wù)和數(shù)據(jù)一致性,并且可被監(jiān)控;
考慮防腐層是否需要處理所有的系統(tǒng)間通訊,還是只需處理一個子集;
如果防腐層是系統(tǒng)遷移戰(zhàn)略的一部分,則需要考慮防腐層是否是永久的,是否在遺留系統(tǒng)功能完全遷移完成后將其移除。
6 相關(guān)模式
-
Facade API模式:
Facade API模式關(guān)注于系統(tǒng)功能如何對使用者友好的呈現(xiàn);而防腐層則關(guān)注于隔離不同架構(gòu)系統(tǒng)間的影響,使各個系統(tǒng)可獨立演進。
在系統(tǒng)架構(gòu)遷移場景下使用的防腐層,通常是臨時存在的。當系統(tǒng)遷移完成后,防腐層就沒有了存在的必要。而Facade API的生命周期依賴系統(tǒng)的外部使用者,只要外部用戶存在,F(xiàn)acade層就應(yīng)存在;如果外部用戶變更,則Facade層則需要一起變更,以適配用戶新的要求。
防腐層需要提供兩個系統(tǒng)間的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換和接口適配,因此比API Facade“胖”。而API Facade只建議簡單的提供接口給用戶,不建議增加較多的邏輯,它應(yīng)該是“瘦”的。
-
適配器模式:
適配器目的是解決差異接口的對接,接口轉(zhuǎn)換是單向的(即從調(diào)用方向被調(diào)用方進行接口轉(zhuǎn)換);防腐層強調(diào)兩個子系統(tǒng)語義解耦,接口轉(zhuǎn)換是雙向的。
7 應(yīng)用場景
漸進式架構(gòu)遷移,需要維護遺留系統(tǒng)和新系統(tǒng)之間的集成;具有不同語意環(huán)境和架構(gòu)的兩個或者多個系統(tǒng),且彼此需要通訊。