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

你可能感兴趣的:(Dubbo服务之Stub和Mock)