Dubbo 实战 - Mock 调用

前言

Dubbo 的 mock 特性既可以用作服务降级处理, 即当服务提供者出错时(抛出 RpcException),进行 mock 调用;同时也可以用于本地测试,用服务消费者端配置的 mock 服务替代要调用的远程服务,亦或者是对某个服务消费者屏蔽服务提供者,不让其进行远程调用。

下面通过举例说明 mock 的作用和使用方式,文中测试代码所使用的 Dubbo 版本为 2.7.7。本文会通过 xml 的方式进行配置。

另外,早期 dubbo 版本的 mock 功能可能有bug,或者功能不够完善。

正文

要使用 mock 功能,需要在服务消费端做一些配置。 可以通过指定 标签 mock 属性实现。

Dubbo 提供以下几种方式来使用Mock能力 :

假设我们现在有一个服务接口为:

package org.apache.dubbo.demo;

public interface DemoService {

    String sayHello(String name);
}

一、fail 策略

当服务消费者调用服务提供者失败后,会去执行配置的 mock 策略。 配置方式为 mock=“fail:策略” 或者 mock=“策略”。

具体策略如下:

1.1 mock=“true”

示例:

<dubbo:reference id="demoService" mock="true" interface="org.apache.dubbo.demo.DemoService"/>

<dubbo:reference id="demoService" mock="fail:true" interface="org.apache.dubbo.demo.DemoService"/>

指定 mock 策略为布尔类型,且为 true ,此时需要消费端提供服务接口的 mock 实现类,该类的包名需要与服务接口一致,且类名格式为 接口名 + Mock, 即 org.apache.dubbo.demo.DemoServiceMock, 当调用远程服务失败后, 就会执行 DemoServiceMock的 sayHello 方法, 如果不提供此 mock 类,dubbo 消费端会启动失败。

错误信息如下:

Caused by: java.lang.ClassNotFoundException: org.apache.dubbo.demo.DemoServiceMock
1.2 mock=“具体的mock实现类”

示例:

<dubbo:reference id="demoService" mock="org.apache.dubbo.demo.consumer.mock.DemoServiceMock2" interface="org.apache.dubbo.demo.DemoService"/>

<dubbo:reference id="demoService" mock="fail:org.apache.dubbo.demo.consumer.mock.DemoServiceMock2" interface="org.apache.dubbo.demo.DemoService"/>

指定 mock 策略为具体的 mock 实现类, 当调用远程服务失败时, 就会执行 mock 实现类的 sayHello 方法.

1.3 mock=“抛出自定义异常”

示例:

<dubbo:reference id="demoService" mock="throw org.apache.dubbo.demo.consumer.exception.CustomException" interface="org.apache.dubbo.demo.DemoService"/>

<dubbo:reference id="demoService" mock="fail:throw org.apache.dubbo.demo.consumer.exception.CustomException" interface="org.apache.dubbo.demo.DemoService"/>

指定 mock 策略为抛出自定义异常, 当远程服务调用失败后, 会给服务消费者抛出自定义异常.

1.4 mock=“返回 mock 数据”

示例:

<dubbo:reference id="demoService" mock="return haha" interface="org.apache.dubbo.demo.DemoService"/>

<dubbo:reference id="demoService" mock="fail:return haha" interface="org.apache.dubbo.demo.DemoService"/>

指定 mock 属性值为返回 mock 数据,当远程服务调用失败后,就会给服务消费者返回 haha。

二、force 策略

当服务消费者调用服务提供者时,会直接执行 mock 配置的策略,不会进行服务调用。

具体的策略跟 fail 策略一致, 此处不再详细说明。

2.1 mock=“force:true”

示例:

<dubbo:reference id="demoService" mock="force:true" interface="org.apache.dubbo.demo.DemoService"/>
2.2 mock=“force:返回mock数据”

示例:

<dubbo:reference id="demoService" mock="force:return xxx" interface="org.apache.dubbo.demo.DemoService"/>
2.3 mock=“force:抛出自定义异常”

示例:

<dubbo:reference id="demoService" mock="force:throw com.apache.dubbo.demo.XXXException" interface="org.apache.dubbo.demo.DemoService"/>
2.4 mock=“force: 执行Mock实现类”

示例:

<dubbo:reference id="demoService" mock="force:com.apache.dubbo.demo.DemoServiceMock2" interface="org.apache.dubbo.demo.DemoService"/>

总结

Dubbo 的 mock 的策略总共分为两大类:

一是当服务调用失败时,去进行 mock 调用;

二是绕过服务调用,直接进行 mock 调用。

而具体的 mock 调用策略又分别 4 种:

1、返回 mock 数据

2、抛出自定义异常

3、执行默认的 Mock 实现类

4、执行指定的 Mock 实现类

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Doe 发布 [V1.0.0] 前段时间排查某问题的时候,想要快速知道某些dubbo接口(三无)的响应结果,但不想启动项目(因为这些项目不是你负责的,不会部署而且超级笨重),也不想新建一个dubbo客户端项目(占地方),也不想开telnet客户端连接口(麻烦而且有限制)。所以扣了dubbo的netty模块源码,封装了个收发客户端集成一个工具,可以快速调试dubbo接口。源码地址:https://github.com/VIPJoey/doe 极简模式 普通模式 目录结构 mmc-dubbo-api 接口项目,主要用于测试。 mmc-dubbo-provider dubbo提供者项目,主要用于测试。 mmc-dubbo-doe 主项目,实现dubbo接口调试。 deploy 部署文档 功能特性 极简模式:通过dubbo提供的telnet协议收发数据。 普通模式:通过封装netty客户端收发数据。 用例模式:通过缓存数据,方便下一次操作,依赖普通模式。 增加依赖:通过调用maven命令,下载jar包和热加载到系统,主要用来分析接口方法参数,主要作用在普通模式。 依赖列表:通过分析pom文件,展示已经加载的jar包。 其它特性 springboot 整合 redis,支持spring el 表达式。 springboot 整合 thymeleaf。 springboot 整合 logback。 netty rpc 实现原理。 开发环境 jdk 1.8 maven 3.5.3 dubbo 2.6.1 lombok 1.16.20 idea 2018 windows 7 安装步骤 安装jdk 安装maven,并设置好环境变量,仓库目录。 进入mmc-dubbo-api目录,执行mvn clean install命令,省api的jar包。 进入mmc-dubbo-doe目录,执行mvn clean install 命令,在target目录生成dubbo-doe-1.0.0-RELEASE.jar 在F盘(可以任意盘)创建目录F:\app\doe 把dubbo-doe-1.0.0-RELEASE.jar拷贝到F:\app\doe 把deploy目录中的所有文件拷贝到F:\app\doe 如果您电脑安装了git bash,可以在bash窗口运行 ./deploy.sh start,否则如果没有安装git bash,只能打开cmd切换到F:\app\doe目录,然后执行java -jar dubbo-doe-1.0.0-RELEASE.jar --spring.profiles.active=prd 打开浏览器,访问地址:http://localhost:9876/doe/home/index 全剧终
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值