目錄
本地存根
- 使用場景
遠程服務後,客戶端通常只剩下接口,而實現全在服務器端,但提供方有些時候想在客戶端也執行部分邏輯,比如:做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" />