網上也看到一些防腐層的優秀文章,在實際的開發項目中,不可避免的,我們也使用到了防腐層,對防腐層,簡單總結一下:
1. 防腐層的意義是什么?
防腐層隔離上游的功能,防腐層通過已有接口和外部系統交互,在內部做己方和他方模型的轉換。
簡單來說,防腐層一般為了隔離兩個系統之間的變化,防止一個系統的微小變化會影響到另外一個系統;還有一個場景,兩個系統的技術棧不一致,所以需要一層代理來兼容。
2. 防腐層的職責
(1)異常降級:對RPC可能出現的異常進行捕獲
(2)超時/重試:RPC接口的超時、重試統一管理;
(3)數據校驗:對返回值的正確性、邊界值進行校驗,進行數據的基本防御,業務代碼邊界值的解耦;
(4)接口防腐:轉換VO對象的時候,避免下游接口的修改,導致自身系統的修改;
3. 防腐層的目的
(1)代碼復用:RPC的調用場景差異化比較小,proxy層調用,提高開發效率;
(2)提供便利性:調用方可以直接調用,對RPC的結果可以直接使用,不用考慮NPE、RPC等異常;
4. 思考
防腐層要做多少事情才是合適的,而又不顯得防腐層很臃腫、很笨重?
我們平時代碼利用防腐層主要做的一些事情,如解封裝、接口檢驗、處理異常、打印日志等;很多時候處理的是一些防止過度開發的模板性代碼。
這里說到過度開發,那就會有一個問題:我們在對接第三方的時候,使用到了第三方的接口與其對應的元數據,那么第三方接口返回的元數據我們是否可以直接使用?
如果直接使用,接口發生改動,返回元數據變化,我們其實也沒能真正意義上做到解耦,除了防腐層的其他地方也還是要做改動。如果做了返回值的convert,對接接口過多的時候,這樣的防腐層會顯得很笨重,過度開發,這樣的矛盾怎么去解決?這里就涉及防腐層的一個邊界問題。
那就要說到防腐層出現的目的,最初是為了屏蔽其他系統的域模型,入參和出參是需要我們自己定義。但是每個接口都這樣處理我們這樣開發量很大,且存在不合理的地方。主要因為我們系統維護了別人域元數據的對等。
這個邊界,可以這么理解:
如果依賴的下游經常有數據變動,或者說域模型和我們自己域的域模型沒有關聯,那我們防腐層就需要進行這樣的convert,自己定義一份;如果依賴的下游比較穩定,我們直接使用也是可以的。