當前位置: 妍妍網 > 碼農

如何優雅的實作介面統一呼叫

2024-04-22碼農

推薦關註

掃碼關註 後端架構師 」,選擇 星標 公眾號

重磅幹貨,第一時間送達!

責編:架構君 | 來源:juejin.cn/post/7276261829726191676

上一篇好文:

正文

大家好,我是後端架構師。

一、耦合問題


有些時候我們在進行介面呼叫的時候,比如說一個 push 推播介面,有可能會涉及到不同渠道的推播。


以我目前業務場景為例,我做結算後端服務的,會與金蝶財務系統進行互動,那麽我結算後端會涉及到多個結算單型別,如果每一個種型別的結算單都去暴露一個 contoller 介面給前端提供,而且其實對接第三方的介面,有些介面是共通的。

前端涉及到的問題

  • 需要呼叫後端多個 controller,不同介面傳不同的參數,如果遇到後端介面修改,會涉及到多個頁面的修改, 耦合度 很高;

  • 需要對多個按鈕設定許可權配置。

  • 後端涉及到的問題

  • 需要每個業務介面,都去寫一個對接第三方介面的 push 推播方法,無形中增加很多重復的程式碼,耦合度也很高;

  • 如果涉及到第三方服務介面改造,後端介面也需要進行更改,會修改大量程式碼。


  • 二、如何解決

  • 建立對接第三方服務的微服務,暫定為 tps 服務,該服務只作為一個後端微服務,與第三方服務進行對接,並且合理封裝呼叫參數,將公共參數提出進行封裝;

  • 後端其余業務系統對接這個獨立的微服務,比如訂單、結算、供應商系統對接這個服務,由 tps 服務統一提供對接介面,其余服務實作這個 tps 提供的 feign 介面;

  • 業務系統只需要關註 service 層業務的實作,無需處理對接的業務邏輯。

  • 大致的流程圖就是這樣的:



    三、具體實作

    Tps 服務

    Tps 服務暴露為 feign 介面,前端統一透過 Tps 提供的介面進行呼叫。

    //對接第三方服務介面
    publicinterfaceIKingdeeManagementService{
    Boolean push(KingdeePushCO.Request request);
    }

    Feign 介面實作類:

    @Slf4j
    @Service
    public classKingdeeManagementServiceImplimplementsIKingdeeManagementService{
    @Autowired
    private ApplicationContext applicationContext;
    @Autowired
    private KingdeeThirdSettingService kingdeeThirdSettingService;
    @Override
    public Boolean push(KingdeePushCO.Request request){
    KingdeeBusinessPushServiceEnum kingdeePushServiceEnum = KingdeeBusinessPushServiceEnum.getKingdeePushServiceEnumByType(request.getBusinessType());
    IKingdeeBusinessPushService kingdeePushService = null;
    try {
    kingdeePushService = (IKingdeeBusinessPushService) applicationContext.getBean(kingdeePushServiceEnum.getClazz());
    catch (BeansException e) {
    log.error("當前型別暫未實作,請聯系開發");
    thrownew ServiceException("當前型別暫未實作,請聯系開發");
    }
    R<Boolean> result = null;
    result = kingdeePushService.pushKingdee(request);

    returntrue;
    }
    }



    列舉類別定義:

    publicenum KingdeeBusinessPushServiceEnum {
    private class clazz;
    private Integer type;
    private String interFaceName;
    KingdeeBusinessPushServiceEnum( class clazz, Integer type, String interFaceName) {
    this.clazz = clazz;
    this.type = type;
    this.interFaceName = interFaceName;
    }
    RECEIPT_VOUCHER(IJaKingdeeBillClient. classKingdeeBusinessTypeConstant.RECEIPT_VOUCHERKingdeeSettingEnum.INTERFACE_TYPE_JA_RECEIPT_VOUCHER.getCode()), ;
    }


    分別有 clazz、type、interFace Name 內容

  • clazz 定義為 feign 介面,業務系統提供的服務介面;

  • type 代表前端需要傳的參數,不同的 Integer 值代表不同的 feign 介面對映;

  • interFaceName 第三方介面列舉,表示需要具體呼叫哪個第三方介面。

  • 業務系統

    拿 bms 服務舉例說明:繼承 Tps 服務的 feign 介面,重寫 push 方法;

    Feign 介面實作,透過 factory 工廠類初始化,不同的 service 實作類;

    JaKingdeeFactoryUtil 工廠工具類,獲取工廠例項,這裏其實也可以使用列舉對映,避免以後介面太多,需要寫很多 case when。

    JaKingdeeServiceFactory 是個介面,提供方法:

    實作上面的介面,透過單例工廠的模式 double check 的模式實作,並且加悲觀鎖,避免一個工作執行緒多次建立工廠例項,SpringContextUtils/getBean/ 獲取 servcie 例項,業務層只需要實作 service 介面,實作不同業務邏輯的 push 推播方法。


    四、總結


    這是我之前設計的關於介面統一呼叫的流程,當然其實還是包括對接第三方重復呼叫的問題、呼叫結果緩存、呼叫超時解決、失敗降級的一些策略,作為拋磚引玉。

    你還有什麽想要補充的嗎?

    最後,再次推薦下我們的AI星

    為了跟上AI時代我幹了一件事兒,我建立了一個知識星球社群:ChartGPT與副業。想帶著大家一起探索 ChatGPT和新的AI時代

    有很多小夥伴搞不定ChatGPT帳號,於是我們決定,凡是這三天之內加入ChatPGT的小夥伴,我們直接送一個正常可用的永久ChatGPT獨立帳戶。

    不光是增長速度最快,我們的星球品質也絕對經得起考驗,短短一個月時間,我們的課程團隊釋出了 8個專欄、18個副業計畫

    簡單說下這個星球能給大家提供什麽:

    1、不斷分享如何使用ChatGPT來完成各種任務,讓你更高效地使用ChatGPT,以及副業思考、變現思路、創業案例、落地案例分享。

    2、分享ChatGPT的使用方法、最新資訊、商業價值。

    3、探討未來關於ChatGPT的機遇,共同成長。

    4、幫助大家解決ChatGPT遇到的問題。

    5、 提供一整年的售後服務,一起搞副業

    星球福利:

    1、加入星球4天後,就送ChatGPT獨立帳號。

    2、邀請你加入ChatGPT會員交流群。

    3、贈送一份完整的ChatGPT手冊和66個ChatGPT副業賺錢手冊。

    其它福利還在籌劃中... 不過,我給你大家保證,加入星球後,收獲的價值會遠遠大於今天加入的門票費用 !

    本星球第一期原價 399 ,目前屬於試營運,早鳥價 139 ,每超過50人漲價10元,星球馬上要來一波大的漲價,如果你還在猶豫,可能最後就要以 更高價格加入了 。。

    早就是優勢。 建議大家盡早以便宜的價格加入!

    歡迎有需要的同學試試,如果本文對您有幫助,也請幫忙點個 贊 + 在看 啦!❤️

    在 還有更多優質計畫系統學習資源,歡迎分享給其他同學吧!

    PS:如果覺得我的分享不錯,歡迎大家隨手點贊、轉發、在看。

    最後給讀者整理了一份BAT大廠面試真題,需要的可掃碼加微信備註:「面試」獲取。

    版權申明:內容來源網路,版權歸原創者所有。除非無法確認,我們都會標明作者及出處,如有侵權煩請告知,我們會立即刪除並表示歉意。謝謝!

    END

    最近面試BAT,整理一份面試資料【Java面試BAT通關手冊】,覆蓋了Java核心技術、JVM、Java並行、SSM、微服務、資料庫、數據結構等等。在這裏,我為大家準備了一份2021年最新最全BAT等大廠Java面試經驗總結。

    別找了,想獲取史上最全的Java大廠面試題學習資料

    掃下方二維碼回復面試就好了

    歷史好文:

    掃碼關註後端架構師」,選擇星標公眾號

    重磅幹貨,第一時間送達

    ,你在看嗎?