Dubbo3 本地偽裝

2022-03-31 17:54 更新

如何在 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" />

進(jìn)階用法

return

使用 ?return ?來返回一個(gè)字符串表示的對象,作為 Mock 的返回值。合法的字符串可以是:

  • empty: 代表空,基本類型的默認(rèn)值,或者集合類的空值
  • null: ?null?
  • true: ?true?
  • false: ?false?
  • JSON 格式: 反序列化 JSON 所得到的對象

throw

使用 ?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" />

force 和 fail

在 ?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" />

在方法級(jí)別配置 Mock

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>


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)