Dubbo之參數配置(四)

目錄

本地存根

本地僞裝

延遲暴露


 

本地存根

  • 使用場景

遠程服務後,客戶端通常只剩下接口,而實現全在服務器端,但提供方有些時候想在客戶端也執行部分邏輯,比如:做ThreadLocal緩存,提前驗證參數,調用失敗後僞造容錯數據等等,此時就需要在API中帶上Stub,客戶端生成Proxy時,會把Proxy通過構造函數傳輸給Stub,然後把Stub暴露給用戶,Stub可以決定要不要去調Proxy。

(1)調用示意圖:

 

 (2)配置及Stub實例

<!--第一種-->
<dubbo:service interface="com.foo.BarService" stub="true" />
<!--第二種-->
<dubbo:service interface="com.foo.BarService" stub=com.foo.BarServiceStub" />
package com.foo;

public class BarServiceStub implements BarSerivce{
    private final BarService barService;
    //構造函數傳入真正的遠程代理對象
    public BarServiceStub(BarSerivce barSerivce){
        this.barService = barService;
    }
    public String sayHello(String name){
        //此代碼在客戶段執行
        //可以在客戶端做ThreadLocal本地緩存,或預先驗證參數是否合法等待
        try{
            return barService.sayHello(name);
        }catch(Exception e){
            //可以容錯
            return "容錯數據";
        }
    }
}

本地僞裝

  • 使用場景

Mock通常用於服務降級,比如某驗權服務,當服務提供方全部掛掉後,客戶端不拋出異常,而是通過Mock數據返回授權失敗。

Mock是Stub的一個子集,便於服務提供方在客戶端執行容錯邏輯,因經常需要在出現RpcException(比如網絡失敗,超時等)時進行容錯,而在出現業務異常(比如登錄用戶名密碼錯誤)時不需要容錯,如果用Stub,可能就需要捕獲並依賴RpcException類,而用Mock就可以不依賴RpcException,因爲它的約定就是隻有出現RpcException時才執行。

  • 配置
<dubbo:service interface="com.foo.BarService" mock="true" />
or
<dubbo:service interface="com.foo.BarService" mock="com.foo.BarServiceMock" />
package com.foo
public class BarServiceMock implements BarService{
    public String sayHello(String name){
        return "容錯數據";
    }
}

如果服務的消費方經常需要try-catch捕獲異常,如:

try{
    //邏輯代碼
}catch(Exception e){
    logger.error(e);
}

可以考慮改爲Mock實現,並在Mock中return null。

<!--如果只是想簡單的忽略異常,在2.0.11以上版本可以用:-->
<dubbo:service interface="com.foo.BarService" mock="return null" />

延遲暴露

  • 使用場景

如果服務需要warmup時間,比如初始化緩存,等待相關資源就位,可以使用delay進行延遲暴露。

<!--延遲暴露5s-->
<dubbo:service delay="5000" />
<!--延遲到Spring初始化完成後,再暴露服務(基於Spring的ContextRefreshedEvent事件觸發暴露-->
<dubbo:service delay="-1" />

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章