Dubbo本地存根是什麼,Dubbo本地偽裝又是什麼?

2022-06-03 18:00:34

真正的大師永遠懷著一顆學徒的心
哈嘍!大家好,我是小奇,一位程式設計師界的學徒
小奇打算以輕鬆幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧


前言

書接上回,昨天打了一天遊戲,我是一頓操作猛如虎、一看戰績0-5,最後網管看不下去把電閘拉了,說我影響網咖的整體勝率,無奈我在一群小學生的哀求下離開了網咖(小學生:大哥我求你了,你快走吧,我們還想玩呢)。

昨天回到家沒事就繼續投簡歷唄,也別挑什麼公司了,就是海投,海投知道什麼意思嗎,就是你的簡歷像投在大海上一樣杳無音信(精闢~)。

還好最後終於有伯樂出現了,她發現了我這匹千里馬,跟我約了第二天的面試,然後我們互換了微信。

加了微信也別閒著呀,先看看朋友圈,根據朋友圈判斷一下這個伯樂好不好拿捏(嘿嘿~)。

看了朋友圈這伯樂挺正呀,就是不知道溫不溫柔,有沒有劉嬸那樣溫柔體貼~

一、面試

1、本地存根

面試官:我看你簡歷上寫的精通Dubbo,那你能說一下Dubbo本地存根是什麼嗎?

我:我認為本地存根類似於AOP面向切面來實現一些功能,但是區別在於是在消費端呼叫伺服器端的時候在消費端執行的一些邏輯。

比如我們消費端在呼叫伺服器端之前可以在消費端進行引數的驗證,在呼叫伺服器端之後如果出現異常,可以在消費端執行一些自定義的例外處理。

官網的解釋是這樣的:在 Dubbo 中利用本地存根在使用者端執行部分邏輯

遠端服務後,使用者端通常只剩下介面,而實現全在伺服器端,但提供方有些時候想在使用者端也執行部分邏輯,比如:做 ThreadLocal 快取,提前驗證引數,呼叫失敗後偽造容錯資料等等,此時就需要在 API 中帶上 Stub,使用者端生成 Proxy 範例,會把 Proxy 通過建構函式傳給 Stub 1,然後把 Stub 暴露給使用者,Stub 可以決定要不要去調 Proxy。


在 spring 組態檔中按以下方式設定:

<dubbo:service interface="com.foo.BarService" stub="true" />

<dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" />

提供 Stub 的實現 :

package com.foo;
public class BarServiceStub implements BarService {
    private final BarService barService;
    
    // 建構函式傳入真正的遠端代理物件
    public BarServiceStub(BarService barService){
        this.barService = barService;
    }
 
    public String sayHello(String name) {
        // 此程式碼在使用者端執行, 你可以在使用者端做ThreadLocal本地快取,或預先驗證引數是否合法,等等
        try {
            return barService.sayHello(name);
        } catch (Exception e) {
            // 你可以容錯,可以做任何AOP攔截事項
            return "容錯資料";
        }
    }
}

2、本地偽裝

面試官:嗯,那你能說一下Dubbo本地偽裝又是什麼嗎?

我:本地偽裝顧名思義就是在消費端本地偽裝一個返回引數直接返回給消費端,原本的流程是消費端呼叫伺服器端,伺服器端返回什麼消費端就返回什麼。

但是現在假如伺服器端停機了,消費端呼叫伺服器端就無法返回想返回的引數型別的資料了,這個時候我們可以在消費端偽裝一個返回的引數,這樣在呼叫伺服器端失敗了,或者根本就不呼叫伺服器端的時候就可以直接返回本地偽裝的資料。

假如現在有個業務場景,就是消費者呼叫伺服器端正常就返回引數,異常就返回一個"容錯資料"。

那麼我們首先在 spring 組態檔中按以下方式設定:這裡相當於BarService是一個本地偽裝介面

<dubbo:reference interface="com.foo.BarService" mock="true" />

然後我們在工程中提供 Mock本地偽裝介面的 實現:

package com.foo;
public class BarServiceMock implements BarService {
    public String sayHello(String name) {
        // 你可以偽造容錯資料,此方法只在出現RpcException時被執行
        return "容錯資料";
    }
}

這樣在伺服器端出現異常的時候,使用者端可以返回自己想返回的資料。

面試官:小夥子不錯呀,什麼時候能回北京入職呢

我:額。。。等等吧,現在還有好多家公司等著談薪資呢,我得挑一家合適的。

面試官:你要多少我都給你,來我這吧

我:額。。。那就月薪100個W吧。

面試官:喂,你說什麼我聽不見,訊號不好。。。

我:喂喂喂(嘟嘟嘟嘟嘟嘟嘟嘟。。。)。

二、總結

這裡的相關內容還沒有整理完畢,文章後面持續更新,建議收藏。

文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。

如果覺得我的文章還不錯的話就點個贊吧