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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容

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