來源官方
本地存根
遠程服務后前域,客戶端通常只剩下接口,而實現(xiàn)全在服務器端封孙,但提供方有些時候想在客戶端也執(zhí)行部分邏輯迹冤,比如:做 ThreadLocal 緩存,提前驗證參數(shù)虎忌,調用失敗后偽造容錯數(shù)據(jù)等等泡徙,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 實例膜蠢,會把 Proxy 通過構造函數(shù)傳給 Stub 1堪藐,然后把 Stub 暴露給用戶莉兰,Stub 可以決定要不要去調 Proxy。
在 spring 配置文件中按以下方式配置:
<dubbo:service interface="com.foo.BarService" stub="true" />
或者
<dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" />
實現(xiàn):
package com.foo;
public class BarServiceStub implements BarService {
private final BarService barService;
// 構造函數(shù)傳入真正的遠程代理對象
public (BarService barService) {
this.barService = barService;
}
public String sayHello(String name) {
// 此代碼在客戶端執(zhí)行, 你可以在客戶端做ThreadLocal本地緩存礁竞,或預先驗證參數(shù)是否合法糖荒,等等
try {
return barService.sayHello(name);
} catch (Exception e) {
// 你可以容錯,可以做任何AOP攔截事項
return "容錯數(shù)據(jù)";
}
}
}
注意:
- Stub 必須有可傳入 Proxy 的構造函數(shù)苏章。
- 在 interface 旁邊放一個 Stub 實現(xiàn)寂嘉,它實現(xiàn) BarService 接口,并有一個傳入遠程 BarService 實例的構造函數(shù)
本地偽裝
本地偽裝 1 通常用于服務降級枫绅,比如某驗權服務泉孩,當服務提供方全部掛掉后,客戶端不拋出異常并淋,而是通過 Mock 數(shù)據(jù)返回授權失敗寓搬。
在 spring 配置文件中按以下方式配置:
<dubbo:service interface="com.foo.BarService" mock="true" />
或
<dubbo:service interface="com.foo.BarService" mock="com.foo.BarServiceMock" />
在工程中提供 Mock 實現(xiàn) 2:
package com.foo;
public class BarServiceMock implements BarService {
public String sayHello(String name) {
// 你可以偽造容錯數(shù)據(jù),此方法只在出現(xiàn)RpcException時被執(zhí)行
return "容錯數(shù)據(jù)";
}
}
如果服務的消費方經(jīng)常需要 try-catch 捕獲異常县耽,如:
Offer offer = null;
try {
offer = offerService.findOffer(offerId);
} catch (RpcException e) {
logger.error(e);
}
請考慮改為 Mock 實現(xiàn)句喷,并在 Mock 實現(xiàn)中 return null。如果只是想簡單的忽略異常兔毙,在 2.0.11
以上版本可用:
<dubbo:service interface="com.foo.BarService" mock="return null" />
1. Mock 是 Stub 的一個子集唾琼,便于服務提供方在客戶端執(zhí)行容錯邏輯,因經(jīng)常需要在出現(xiàn) RpcException (比如網(wǎng)絡失敗澎剥,超時等)時進行容錯锡溯,而在出現(xiàn)業(yè)務異常(比如登錄用戶名密碼錯誤)時不需要容錯,如果用 Stub哑姚,可能就需要捕獲并依賴 RpcException 類祭饭,而用 Mock 就可以不依賴 RpcException,因為它的約定就是只有出現(xiàn) RpcException 時才執(zhí)行叙量。 ?
2. 在 interface 旁放一個 Mock 實現(xiàn)倡蝙,它實現(xiàn) BarService 接口,并有一個無參構造函數(shù)