W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
如何在 Dubbo 中利用本地偽裝實(shí)現(xiàn)服務(wù)降級(jí)
本地偽裝通常用于服務(wù)降級(jí),比如某驗(yàn)權(quán)服務(wù),當(dāng)服務(wù)提供方全部掛掉后,客戶端不拋出異常,而是通過 Mock 數(shù)據(jù)返回授權(quán)失敗。
注:Mock 是 Stub 的一個(gè)子集,便于服務(wù)提供方在客戶端執(zhí)行容錯(cuò)邏輯,因經(jīng)常需要在出現(xiàn) RpcException (比如網(wǎng)絡(luò)失敗,超時(shí)等)時(shí)進(jìn)行容錯(cuò),而在出現(xiàn)業(yè)務(wù)異常(比如登錄用戶名密碼錯(cuò)誤)時(shí)不需要容錯(cuò),如果用 Stub,可能就需要捕獲并依賴 RpcException 類,而用 Mock 就可以不依賴 RpcException,因?yàn)樗募s定就是只有出現(xiàn) RpcException 時(shí)才執(zhí)行。
在 spring 配置文件中按以下方式配置:
<dubbo:reference interface="com.foo.BarService" mock="true" />
或
<dubbo:reference interface="com.foo.BarService" mock="com.foo.BarServiceMock" />
在工程中提供 Mock 實(shí)現(xiàn) (在 interface 旁放一個(gè) Mock 實(shí)現(xiàn),它實(shí)現(xiàn) BarService 接口,并有一個(gè)無參構(gòu)造函數(shù) ):
package com.foo;
public class BarServiceMock implements BarService {
public String sayHello(String name) {
// 你可以偽造容錯(cuò)數(shù)據(jù),此方法只在出現(xiàn)RpcException時(shí)被執(zhí)行
return "容錯(cuò)數(shù)據(jù)";
}
}
如果服務(wù)的消費(fèi)方經(jīng)常需要 try-catch 捕獲異常,如:
Offer offer = null;
try {
offer = offerService.findOffer(offerId);
} catch (RpcException e) {
logger.error(e);
}
請考慮改為 Mock 實(shí)現(xiàn),并在 Mock 實(shí)現(xiàn)中 return null。如果只是想簡單的忽略異常,在 ?2.0.11
?以上版本可用:
<dubbo:reference interface="com.foo.BarService" mock="return null" />
使用 ?return
?來返回一個(gè)字符串表示的對象,作為 Mock 的返回值。合法的字符串可以是:
null
?true
?false
?使用 ?throw
?來返回一個(gè) Exception 對象,作為 Mock 的返回值。
當(dāng)調(diào)用出錯(cuò)時(shí),拋出一個(gè)默認(rèn)的 RPCException:
<dubbo:reference interface="com.foo.BarService" mock="throw" />
當(dāng)調(diào)用出錯(cuò)時(shí),拋出指定的 Exception:
<dubbo:reference interface="com.foo.BarService" mock="throw com.foo.MockException" />
在 ?2.6.6
?以上的版本,可以開始在 Spring XML 配置文件中使用 ?fail:
? 和 ?force:
?。?force:
? 代表強(qiáng)制使用 Mock 行為,在這種情況下不會(huì)走遠(yuǎn)程調(diào)用。?fail:
?與默認(rèn)行為一致,只有當(dāng)遠(yuǎn)程調(diào)用發(fā)生錯(cuò)誤時(shí)才使用 Mock 行為。?force:
?和? fail:
? 都支持與 ?throw
?或者 ?return
?組合使用。
強(qiáng)制返回指定值:
<dubbo:reference interface="com.foo.BarService" mock="force:return fake" />
強(qiáng)制拋出指定異常:
<dubbo:reference interface="com.foo.BarService" mock="force:throw com.foo.MockException" />
Mock 可以在方法級(jí)別上指定,假定 ?com.foo.BarService
? 上有好幾個(gè)方法,我們可以單獨(dú)為? sayHello()
? 方法指定 Mock 行為。具體配置如下所示,在本例中,只要 ?sayHello()
?被調(diào)用到時(shí),強(qiáng)制返回 “fake”:
<dubbo:reference id="demoService" check="false" interface="com.foo.BarService">
<dubbo:parameter key="sayHello.mock" value="force:return fake"/>
</dubbo:reference>
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)系方式:
更多建議: