• 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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    一、fail 策略

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

    具体策略如下:

    1.1 mock=“true”

    示例:

    
    
    
    
    • 1
    • 2
    • 3

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

    错误信息如下:

    Caused by: java.lang.ClassNotFoundException: org.apache.dubbo.demo.DemoServiceMock
    
    • 1

    1.2 mock=“具体的mock实现类”

    示例:

    
    
    
    
    • 1
    • 2
    • 3

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

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

    示例:

    
    
    
    
    • 1
    • 2
    • 3

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

    1.4 mock=“返回 mock 数据”

    示例:

    
    
    
    
    • 1
    • 2
    • 3

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

    二、force 策略

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

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

    2.1 mock=“force:true”

    示例:

    
    
    • 1

    2.2 mock=“force:返回mock数据”

    示例:

    
    
    • 1

    2.3 mock=“force:抛出自定义异常”

    示例:

    
    
    • 1

    2.4 mock=“force: 执行Mock实现类”

    示例:

    
    
    • 1

    总结

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

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

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

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

    1、返回 mock 数据

    2、抛出自定义异常

    3、执行默认的 Mock 实现类

    4、执行指定的 Mock 实现类

  • 相关阅读:
    计算机网络---网络层
    分布式事务Seata源码解析九:分支事务如何注册到全局事务
    国内AI绘画软件“数画”的相机溯源码功能太强大,彻底消灭盗图
    Hadoop学习记录3--HDFS知识补充
    Unity 脚本常用特性
    Thymeleaf 多个选项卡如何分页?亲后端没有思路
    尚硅谷HTML习笔记
    jni头文件详解
    使用antd的上传组件做上传附件数据校验踩坑
    【C++模块实现】| 【06】日志模块添加循环覆盖写文件功能
  • 原文地址:https://blog.csdn.net/m0_67400973/article/details/126327771