Dubbo Stub与Mock

本文详细介绍了Dubbo中的本地Stub和Mock,包括它们的概念、使用方式、常见应用场景,以及如何实现Stub和Mock。通过示例演示和源码分析,帮助读者理解它们的工作原理,为服务开发过程中的测试和容错提供了有效解决方案。
摘要由CSDN通过智能技术生成

前言

大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo StubMock。在前一个章节中我们介绍了 Dubbo 事件通知,以及我们也例举了常见的使用场景并且进行了源码解析来分析其实现原理,同时知道 Dubbo 中的事件通知可以在某个服务调用之前、调用之后、异常发生时触发回调事件,我们可以通过回调事件做一些额外的工作。我们在 Dubbo 服务开发过程中可能遇到我们调用的服务方并没有编写完成,那我们是不是需要等待服务提供方开发完成我们才能开始测试呢?那么在本章节我们会通过介绍 Dubbo StubMock来解决这个问题。那么什么是 StubMock ?下面就让我们快速开始吧!

1. 本地 Stub/Mock 简介

在 Dubbo 中提供的 Stub 也可称为本地存根具有类似代理模式的功能,即把我们调用的真正对象重新包装然后把包装对象提供给调用方,那么在调用真正的对象之前和之后我们可以做相应处理逻辑。同理 Mock 也可称为本地伪装和本地存根具有类似原理只是 Mock 针对发生RpcException异常或者我们强制使用 Mock 方式才去调用 Mock 的实现。从下面我们可以看出来StubMock与代理对象关系:

本地存根和伪装

从图中我们可以看出的 StubMock 都是实现同一个服务的接口,它们都是通过代理对象来调用远程暴露的服务,而 Mock 紧紧是在调用失败时会触发。

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

2. 使用方式

2.1 Stub 配置方式

<dubbo:service interface="com.foo.BarService" stub="true" />

或者

<dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" />

Stub 的实现类:

/**
 * @author <a href="http://youngitman.tech">青年IT男</a>
 * @version v1.0.0
 * @className BookFacadeStub
 * @description
 * @JunitTest: {@link  }
 * @date 2020-11-15 23:43
 **/
public class BookFacadeStub implements BookFacade {
   

   //真正远程服务对象
    private BookFacade bookFacade;

    //必须提供BookFacade签名的构造函数
    public BookFacadeStub(BookFacade bookFacade){
   

        this.bookFacade = bookFacade;
        
    }

    @Override
    public List<Book> queryAll() {
   

        try {
   
            
            //做一些前置处理
            
            return bookFacade.queryAll();
            
        } catch (Exception e) {
   
            // 发生异常做一些处理
            return Lists.newArrayList();
            
        }finally {
   
            
            //做一些后置处理
            
        }
        
    }

}

2.2 Mock 配置方式

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

或者

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

Mock 的实现类:

public class BookFacadeMock implements BookFacade {
   

    /**
     *
     * 这里我们可以把服务端的方法执行时间加大 使之超时就可以触发Mock的调用
     *
     * @author liyong 
     * @date 12:18 AM 2020/11/16 
     * @param  
     * @exception 
     * @return List<Book> 
     **/
    @Override
    public List<Book> queryAll() {
   

        // 你可以伪造容错数据,此方法只在出现RpcException时被执行
        Book book = new Book();
        book.setDesc("default");
        book.setName("default");
        return Lists.newArrayList(book);

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青年IT男

您的打赏就是对我的肯定!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值