美文网首页
Dubbo服务之Stub和Mock

Dubbo服务之Stub和Mock

作者: MakeItSimple | 来源:发表于2019-10-13 16:55 被阅读0次

Dubbo服务中包含两个功能,感觉还是蛮有意思的,一个是本地存根,一个是本地伪装。学习了文末的参考文章,感觉说的很清晰,也不必在本文重述了。本文做些补充吧。

1、本地存根(Stub)

作用

  • 控制是否调用服务端dubbo服务。比如:
    1)参数检查不通过,不发起调用。
    2)缓存中有了,不发起调用。
  • 控制调用完毕后的行为。比如:
    1)写缓存,发送消息之类。
  • 控制接口异常时的行为(跟Mock类似)。

缺点

类爆炸:消费端或者服务端需要为每个接口定义一个XXXServiceStub,而且这个类中还必须实现所有的方法。

使用场景

如果想控制是否真实调用dubbo服务,或者在调用前后做些事情的时候,可以考虑使用这个机制。可以给接口定义默认的Stub(定义在Provider),也可以各个Consumer自己定义。

补充说明

有两种方式可以实现,一个是定义在Provider(ServiceConfig),一个是定义在Consumer(ReferenceConfig)。二者的区别就在于:

  1. 如果定义在ServiceConfig中,那么只要定义的XXXServiceStub类包含在了用户所暴露的dubbo服务接口的jar包中,那么客户端无需再定义,直接就可以使用,相当于定义了服务端的一个默认行为。
    当然,客户端也可以强制指定referenceConfig.setStub(false)来关闭这个默认行为。或者自己指定Stub类,比如:referenceConfig.setStub("DubboServiceStub")。DubboServiceStub是Consumer自己定义的Stub。
  2. 如果定义在了ReferenceConfig中,那么就不是全局的行为了,只是这个Consumer自己的行为。其他的消费者不可见。

2、本地伪装(Mock)

作用

调用dubbo接口异常(Provicer不可用、超时等抛出RpcException)后,可以指定默认的返回值。也可以强制指定返回mock值,此时不再调用到Provider,Consumer直接返回了。
比如:用户认证服务的provider都死掉了,这里可以加上Mock,直接返回用户认证失败的消息即可,而不用再抛出异常。

使用场景

想要定义接口异常时的默认返回值时可以考虑使用Mock。类似于软降级。

缺点

使用Mock后,异常消息不再被打印,被吞掉了。

注意事项

1、与Stub不同,Mock只能使用在Consumer,不能定义在Provider。另外,可以不实现XXXServiceMock类,直接配置返回也是可以的。
类似这样指定:

referenceConfig.setMock("return null");

有return、throw、force、fail语句可指定,详细参见参考文档。这样指定避免了类爆炸,比Stub好。
2、Mock的配置极其方便,而且支持配置到方法级别。详细参见参考文档。
3、Stub中可以指定异常时的返回值,Mock也能指定。那么如果二者都指定了,那怎么办?以Mock为准。
如果指定了Mock,其实Stub中的就自动失效了,因为指定Mock后,异常被它截获并处理掉了,不会在Stub中再走到RpcException中了。如下所示:
假设DubboService服务已经指定了Mock。

referenceConfig.setMock("return null");//捕获RpcException异常直接返回null

Stub中也定义了异常处理逻辑,如下:

public class DubboServiceStub implements DubboService {
// 省略其他代码
    public String sayHello(String s, Long aLong) {
        try {
            System.out.println("clinet stub");
            return dubboService.sayHello(s, aLong); 
        } catch (RpcException ex) {
            return "stub exception"; //----> 指定了Mock后,这里不会走进来,因为sayHello不会抛异常。这个异常被Mock截获处理掉了。
        }
    }

4、如果想提供Provider对于RpcException的默认处理,可以使用Stub。Mock没法提供这样的功能,只能每个Consumer自己定义。而且由2可知,一旦Mock定义了,Stub的默认行为也被覆盖了。符合Consumer定义大于默认行为的原则。

参考文章

http://dubbo.apache.org/zh-cn/blog/dubbo-stub-mock.html
http://dubbo.apache.org/zh-cn/docs/user/demos/local-mock.html
http://dubbo.apache.org/zh-cn/docs/user/demos/local-stub.html

相关文章

  • Dubbo优雅服务降级之Stub和回声服务

    上篇Dubbo优雅服务降级之mock描述了关于mock的细节。此篇就详述一下关于Stub的实现。 在dubbo的官...

  • Dubbo服务之Stub和Mock

    Dubbo服务中包含两个功能,感觉还是蛮有意思的,一个是本地存根,一个是本地伪装。学习了文末的参考文章,感觉说的很...

  • Dubbo优雅服务降级之mock

    [Dubbo优雅服务降级之Stub][Dubbo_Stub] dubbo作为国内互联网最常用的Java开源服务治理...

  • Dubbo Stub与Mock

    前言 大家好,今天开始给大家分享 — Dubbo 专题之 Dubbo Stub和Mock。在前一个章节中我们介绍了...

  • dubbo mock/local/stub 功能

    stub=true or default 设为true/default,表示使用缺省代理类名,即:接口名 + Lo...

  • 测试之stub和mock

    Mock 关注行为验证。细粒度的测试,即代码的逻辑,多数情况下用于单元测试。 Stub 关注状态验证。粗粒度的测试...

  • Dubbo配置参数详解-stub

    Dubbo配置参数详解-stub Dubbo是一个由阿里开源的服务治理框架,笔者的公司重度使用Dubbo。Dubb...

  • Java单元测试

    概念 Stub和Mock 为什么使用Stub或者Mock? 因为要测试的对象通常会依赖于其他对象,而我们并不需要测...

  • Mock and Stub

    description: We have a dojo about Mock and Stub.But first...

  • 【JAVA UT】15、mock与stub的比较

    文|码术张 本节通过比较stub与mock,加深对stub、mock的认识。 1、相同点 都是在ut中消除依赖的一...

网友评论

      本文标题:Dubbo服务之Stub和Mock

      本文链接:https://www.haomeiwen.com/subject/wbtkmctx.html