Dubbo服务之Stub和Mock

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 先看官网两张图【引用来自官网】:image.png 官网说明: 1.首先 ReferenceConfig 类的 i...
    致虑阅读 1,046评论 0 2
  • 官方文档 快速启动 关键配置 启动类 XML配置-标签的含义-配置的优先级 dubbo-admin搭建-githu...
    巨子联盟阅读 19,837评论 3 7
  • 一、Dubbo简介 Dubbo是Alibaba开源的分布式服务框架,它按照分层的方式来架构,使用这种方式可以使各层...
    落地生涯阅读 2,267评论 0 9
  • 今天妈妈教我怎样蒸包子,我非常开心,因为今天做的是我最爱吃的马齿包。 妈妈拿出了一些面粉,然后再在...
    李怡然_RAN阅读 493评论 0 1
  • 2019的个人立目标,这两天大家好像立完了。个人的目标很好做规划,无非健康、学习、个人提升和生活。 工作上,如果你...
    萧萧笔记阅读 23,267评论 0 4