Dubbo3 本地伪装

2022-03-31 17:54 更新

如何在 Dubbo 中利用本地伪装实现服务降级

本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败。

注:Mock 是 Stub 的一个子集,便于服务提供方在客户端执行容错逻辑,因经常需要在出现 RpcException (比如网络失败,超时等)时进行容错,而在出现业务异常(比如登录用户名密码错误)时不需要容错,如果用 Stub,可能就需要捕获并依赖 RpcException 类,而用 Mock 就可以不依赖 RpcException,因为它的约定就是只有出现 RpcException 时才执行。

在 spring 配置文件中按以下方式配置:

<dubbo:reference interface="com.foo.BarService" mock="true" />

<dubbo:reference interface="com.foo.BarService" mock="com.foo.BarServiceMock" />

在工程中提供 Mock 实现 (在 interface 旁放一个 Mock 实现,它实现 BarService 接口,并有一个无参构造函数 ):

package com.foo;
public class BarServiceMock implements BarService {
    public String sayHello(String name) {
        // 你可以伪造容错数据,此方法只在出现RpcException时被执行
        return "容错数据";
    }
}

如果服务的消费方经常需要 try-catch 捕获异常,如:

Offer offer = null;
try {
    offer = offerService.findOffer(offerId);
} catch (RpcException e) {
   logger.error(e);
}

请考虑改为 Mock 实现,并在 Mock 实现中 return null。如果只是想简单的忽略异常,在 ​2.0.11 ​以上版本可用:

<dubbo:reference interface="com.foo.BarService" mock="return null" />

进阶用法

return

使用 ​return ​来返回一个字符串表示的对象,作为 Mock 的返回值。合法的字符串可以是:

  • empty: 代表空,基本类型的默认值,或者集合类的空值
  • null: ​null
  • true: ​true
  • false: ​false
  • JSON 格式: 反序列化 JSON 所得到的对象

throw

使用 ​throw ​来返回一个 Exception 对象,作为 Mock 的返回值。

当调用出错时,抛出一个默认的 RPCException:

<dubbo:reference interface="com.foo.BarService" mock="throw" />

当调用出错时,抛出指定的 Exception:

<dubbo:reference interface="com.foo.BarService" mock="throw com.foo.MockException" />

force 和 fail

在 ​2.6.6 ​以上的版本,可以开始在 Spring XML 配置文件中使用 ​fail:​ 和 ​force:​。​force:​ 代表强制使用 Mock 行为,在这种情况下不会走远程调用。​fail: ​与默认行为一致,只有当远程调用发生错误时才使用 Mock 行为。​force: ​和​ fail:​ 都支持与 ​throw ​或者 ​return ​组合使用。

强制返回指定值:

<dubbo:reference interface="com.foo.BarService" mock="force:return fake" />

强制抛出指定异常:

<dubbo:reference interface="com.foo.BarService" mock="force:throw com.foo.MockException" />

在方法级别配置 Mock

Mock 可以在方法级别上指定,假定 ​com.foo.BarService​ 上有好几个方法,我们可以单独为​ sayHello()​ 方法指定 Mock 行为。具体配置如下所示,在本例中,只要 ​sayHello() ​被调用到时,强制返回 “fake”:

<dubbo:reference id="demoService" check="false" interface="com.foo.BarService">
    <dubbo:parameter key="sayHello.mock" value="force:return fake"/>
</dubbo:reference>


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号