W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在 Dubbo 中利用本地存根在客戶端執(zhí)行部分邏輯
遠(yuǎn)程服務(wù)后,客戶端通常只剩下接口,而實(shí)現(xiàn)全在服務(wù)器端,但提供方有些時(shí)候想在客戶端也執(zhí)行部分邏輯,比如:做 ThreadLocal 緩存,提前驗(yàn)證參數(shù),調(diào)用失敗后偽造容錯(cuò)數(shù)據(jù)等等,此時(shí)就需要在 API 中帶上 Stub,客戶端生成 Proxy 實(shí)例,會(huì)把 Proxy 通過構(gòu)造函數(shù)傳給 Stub (Stub 必須有可傳入 Proxy 的構(gòu)造函數(shù)),然后把 Stub 暴露給用戶,Stub 可以決定要不要去調(diào) Proxy。
在 spring 配置文件中按以下方式配置:
<dubbo:consumer interface="com.foo.BarService" stub="true" />
或
<dubbo:consumer interface="com.foo.BarService" stub="com.foo.BarServiceStub" />
提供 Stub 的實(shí)現(xiàn) (在 interface 旁邊放一個(gè) Stub 實(shí)現(xiàn),它實(shí)現(xiàn) BarService 接口,并有一個(gè)傳入遠(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) {
// 你可以容錯(cuò),可以做任何AOP攔截事項(xiàng)
return "容錯(cuò)數(shù)據(jù)";
}
}
}
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: