Dubbo3 本地存根

2022-04-01 17:05 更新

在 Dubbo 中利用本地存根在客戶端執(zhí)行部分邏輯

遠(yuǎn)程服務(wù)后,客戶端通常只剩下接口,而實(shí)現(xiàn)全在服務(wù)器端,但提供方有些時候想在客戶端也執(zhí)行部分邏輯,比如:做 ThreadLocal 緩存,提前驗(yàn)證參數(shù),調(diào)用失敗后偽造容錯數(shù)據(jù)等等,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 實(shí)例,會把 Proxy 通過構(gòu)造函數(shù)傳給 Stub (Stub 必須有可傳入 Proxy 的構(gòu)造函數(shù)),然后把 Stub 暴露給用戶,Stub 可以決定要不要去調(diào) Proxy。

/user-guide/images/stub.jpg

在 spring 配置文件中按以下方式配置:

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

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

提供 Stub 的實(shí)現(xiàn) (在 interface 旁邊放一個 Stub 實(shí)現(xiàn),它實(shí)現(xiàn) BarService 接口,并有一個傳入遠(yuǎn)程 BarService 實(shí)例的構(gòu)造函數(shù)):

package com.foo;
public class BarServiceStub implements BarService {
    private final BarService barService;
    
    // 構(gòu)造函數(shù)傳入真正的遠(yuǎn)程代理對象
    public BarServiceStub(BarService barService){
        this.barService = barService;
    }
 
    public String sayHello(String name) {
        // 此代碼在客戶端執(zhí)行, 你可以在客戶端做ThreadLocal本地緩存,或預(yù)先驗(yàn)證參數(shù)是否合法,等等
        try {
            return barService.sayHello(name);
        } catch (Exception e) {
            // 你可以容錯,可以做任何AOP攔截事項(xiàng)
            return "容錯數(shù)據(jù)";
        }
    }
}


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號