成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

小設計,大作用——談談防腐層的妙用

開發 前端
大多數應用程序依賴于其他系統的某些數據或功能。例如,舊版應用程序遷移到新式系統時,可能仍需要現有的舊的資源。

前言

最近在看領域驅動模型DDD相關的東西,由于沒有實際的項目支撐,所以大都是停留在一些理論層面。但是我發現這里面的一些設計思想還是非常有實用價值的,可以直接應用于你目前的項目中,今天我就來談談防腐層的妙用。

一個簡單的例子

大家在做項目中是否有過這樣的經歷,你的項目中需要調用一個外部服務接口,而這個外部服務接口需要在你的項目中的不同地方被多次使用,比如在公司項目中就出現調用下面獲取用戶詳細信息的外部的接口多達10幾次。

SessionUser getUserDetail(String username)SessionUser getUserDetail(String username)

一旦這個外部接口發生變化,那么是不是意味著我就要修改這幾十處的地方,簡直頭大。

那我們是不是可以對外部接口做一層適配封裝,隔離這種可能地、不可控的變化。因此在我們的manager層中添加了一個UserManager的類,如下所示:

@Component
public class UserManager() {

    @Autowired
    private UserApi remoteUserApi;

    public UserDTO getUserDetail(String username) {
  SessionUser sessionUser = remoteUserApi.getUserDetail(username);
        UserDTO user = convertUser(sessionUser);
        return user;
    }
}@Component
public class UserManager() {

    @Autowired
    private UserApi remoteUserApi;

    public UserDTO getUserDetail(String username) {
  SessionUser sessionUser = remoteUserApi.getUserDetail(username);
        UserDTO user = convertUser(sessionUser);
        return user;
    }
}

我們讓系統中的業務層從原來直接調用remoteUserApi.getUserDetail(String username)改為調用UserManager#getUserDetail(),這樣哪怕有一天外部接口的返回內容、方法名發生變化,我們也只需要修改一下這一個地方,而無需修改上層調用的十幾處地方。

另外,我們還可以再這一層加入更多的功能,比如參數校驗,日志打印等等,如下代碼所示:

@Component
public class UserManager() {

    @Autowired
    private UserApi remoteUserApi;

    public List<UserDTO> getUserDetail(String username) {
        // 參數校驗
        if(StrUtils.isBlank(username)) {
            throw new UserException("用戶名不能為空");
        }
        long t1 = System.currentTimeMillis();
  SessionUser sessionUser = remoteUserApi.getUserDetail(username);
        long t2 = System.currentTimeMillis();
        // 打印日志,方便甩鍋    
        if(t2 - t1 > 3000L) {
            log.warn("調用外部接口耗時過長,cost:[{}]ms", t2 - t1);
        }
        UserDTO user = convertUser(sessionUser);
        return user;
    }
}@Component
public class UserManager() {

    @Autowired
    private UserApi remoteUserApi;

    public List<UserDTO> getUserDetail(String username) {
        // 參數校驗
        if(StrUtils.isBlank(username)) {
            throw new UserException("用戶名不能為空");
        }
        long t1 = System.currentTimeMillis();
  SessionUser sessionUser = remoteUserApi.getUserDetail(username);
        long t2 = System.currentTimeMillis();
        // 打印日志,方便甩鍋    
        if(t2 - t1 > 3000L) {
            log.warn("調用外部接口耗時過長,cost:[{}]ms", t2 - t1);
        }
        UserDTO user = convertUser(sessionUser);
        return user;
    }
}

我們可以加上額外的參數驗證,打印調用外部接口的耗時,有理由“甩鍋”。

防腐層介紹

通過上面一個簡單的例子,你是不是對防腐層有了一個初步的認識。通俗的說,我們認為外部系統、接口中間件等都是腐爛的,不可控的,我們需要添加一層去做隔離和防腐,被叫做防腐層。

大多數應用程序依賴于其他系統的某些數據或功能。例如,舊版應用程序遷移到新式系統時,可能仍需要現有的舊的資源。新功能必須能夠調用舊系統。逐步遷移尤其如此,隨著時間推移,較大型應用程序的不同功能遷移到新式系統中。

這些舊系統通常會出現質量問題,如復雜的數據架構或過時的 API。舊系統使用的功能和技術可能與新式系統中的功能和技術有很大差異。若要與舊系統進行互操作,新應用程序可能需要支持過時的基礎結構、協議、數據模型、API、或其他不會引入新式應用程序的功能。不僅僅是舊系統,不受開發團隊控制的任何外部系統(第三方系統)都可能出現類似的問題,因此引入防腐層去做隔離解決。

圖片圖片

如上圖所示,子系統 A 通過防腐層調用子系統 B。子系統 A 與防腐層之間的通信始終使用子系統 A 的數據模型和體系結構。防腐層向子系統 B 發出的調用符合該B子系統的數據模型或方法。防腐層包含在兩個系統之間轉換所必需的所有邏輯。該層可作為應用程序內的組件或作為獨立服務實現。

總結

說了那么多,這是不是和設計模式中的適配器模式很像,實際上防腐層也叫適配層。當然寫防腐層也是有代價的。最大的代價就是有「額外的開發成本」。所以如果你的上下游比較少,且比較穩定,其實是可以不用防腐層的。但是在大型團隊,付出這些額外的開發成本是有價值的,因為大型團隊的上下游關系非常復雜,他們可能不是在一個團隊,也有可能經常進行迭代升級,通過我自己的經驗來看,接口變化是經常會發生的。

責任編輯:武曉燕 來源: JAVA旭陽
相關推薦

2020-12-17 06:44:00

防腐層驅動

2011-10-13 15:46:48

通知中心手機

2020-10-20 17:03:19

戴爾

2011-04-26 16:25:42

掃描儀應用維護

2012-07-16 10:19:02

MongoDB

2022-06-07 08:31:44

JavaUnsafe

2023-12-25 12:57:00

樹形結構CSScounters

2011-04-29 13:55:31

一體機

2023-01-05 11:27:27

技術架構

2023-09-14 12:46:00

模型數據

2021-11-21 22:33:14

微信功能技巧

2015-09-28 16:35:06

數據中心光模塊

2016-09-09 12:51:23

PhxSQL原則局限性

2013-02-22 15:09:20

8路服務器TS850

2021-02-25 23:57:09

數據分析大數據技術

2014-01-16 09:22:56

Chrome圖標

2023-12-05 16:01:12

模板方法設計模式算法結構

2020-10-16 16:16:39

MAXHUB

2014-06-17 09:42:05

軟件開發軟件設計

2010-09-29 15:17:22

J2MEDisplay類
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费人成激情视频在线观看冫 | 久久精品国产亚洲 | 亚洲精品在线免费看 | 欧美一区二区三区在线观看 | 6996成人影院网在线播放 | 中文天堂网 | 国内精品久久久久久影视8 最新黄色在线观看 | 色婷婷精品久久二区二区蜜臂av | 九九99靖品 | 日日欧美 | 免费精品久久久久久中文字幕 | 精品二区 | 色婷婷av久久久久久久 | 成年人免费在线视频 | 日韩一区二区在线视频 | 日韩精品一区二区久久 | 欧美一区视频 | 毛片一区二区三区 | 激情影院久久 | 日韩a在线观看 | a a毛片| 天天操网 | 免费1区2区3区 | 先锋av资源网 | 精品国产91 | 国产精品久久久久久av公交车 | 九九av | 全部免费毛片在线播放网站 | 亚洲人成人一区二区在线观看 | 久久久久久久一区二区三区 | 一区欧美| 国产一区二区三区四区 | 99视频在线免费观看 | 国产999精品久久久 日本视频一区二区三区 | 射久久 | 国产a级黄色录像 | 欧美一区二区三区视频 | 国产成人短视频在线观看 | 激情五月综合 | 99久久婷婷国产亚洲终合精品 | 天天天天天操 |