本地伪装

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

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

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

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

在工程中提供 Mock 实现 [2]

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

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

  1. Offer offer = null;
  2. try {
  3. offer = offerService.findOffer(offerId);
  4. } catch (RpcException e) {
  5. logger.error(e);
  6. }

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

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

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

  • 在 interface 旁放一个 Mock 实现,它实现 BarService 接口,并有一个无参构造函数 ↩︎

原文: http://dubbo.apache.org/#!/docs/user/demos/local-mock.md?lang=zh-cn