Dubbo本地存根是什么,Dubbo本地伪装又是什么?

Posted 学无止境小奇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dubbo本地存根是什么,Dubbo本地伪装又是什么?相关的知识,希望对你有一定的参考价值。

真正的大师永远怀着一颗学徒的心
哈喽!大家好,我是小奇,一位程序员界的学徒
小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧
文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!回复【项目】有我为大家准备的一些项目源码。回复【简历模板】有我为大家准备的简历模板。

文章目录


前言

书接上回,昨天打了一天游戏,我是一顿操作猛如虎、一看战绩0-5,最后网管看不下去把电闸拉了,说我影响网吧的整体胜率,无奈我在一群小学生的哀求下离开了网吧(小学生:大哥我求你了,你快走吧,我们还想玩呢)。

昨天回到家没事就继续投简历呗,也别挑什么公司了,就是海投,海投知道什么意思吗,就是你的简历像投在大海上一样杳无音信(精辟~)。

还好最后终于有伯乐出现了,她发现了我这匹千里马,跟我约了第二天的面试,然后我们互换了微信。

加了微信也别闲着呀,先看看朋友圈,根据朋友圈判断一下这个伯乐好不好拿捏(嘿嘿~)。

看了朋友圈这伯乐挺正呀,就是不知道温不温柔,有没有刘婶那样温柔体贴~

一、面试

1、本地存根

面试官:我看你简历上写的精通Dubbo,那你能说一下Dubbo本地存根是什么吗?

我:我认为本地存根类似于AOP面向切面来实现一些功能,但是区别在于是在消费端调用服务端的时候在消费端执行的一些逻辑。

比如我们消费端在调用服务端之前可以在消费端进行参数的验证,在调用服务端之后如果出现异常,可以在消费端执行一些自定义的异常处理。

官网的解释是这样的:在 Dubbo 中利用本地存根在客户端执行部分逻辑

远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub 1,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。


在 spring 配置文件中按以下方式配置:

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

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

提供 Stub 的实现 :

package com.foo;
public class BarServiceStub implements BarService 
    private final BarService barService;
    
    // 构造函数传入真正的远程代理对象
    public BarServiceStub(BarService barService)
        this.barService = barService;
    
 
    public String sayHello(String name) 
        // 此代码在客户端执行, 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等
        try 
            return barService.sayHello(name);
         catch (Exception e) 
            // 你可以容错,可以做任何AOP拦截事项
            return "容错数据";
        
    

2、本地伪装

面试官:嗯,那你能说一下Dubbo本地伪装又是什么吗?

我:本地伪装顾名思义就是在消费端本地伪装一个返回参数直接返回给消费端,原本的流程是消费端调用服务端,服务端返回什么消费端就返回什么。

但是现在假如服务端停机了,消费端调用服务端就无法返回想返回的参数类型的数据了,这个时候我们可以在消费端伪装一个返回的参数,这样在调用服务端失败了,或者根本就不调用服务端的时候就可以直接返回本地伪装的数据。

假如现在有个业务场景,就是消费者调用服务端正常就返回参数,异常就返回一个"容错数据"。

那么我们首先在 spring 配置文件中按以下方式配置:这里相当于BarService是一个本地伪装接口

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

然后我们在工程中提供 Mock本地伪装接口的 实现:

package com.foo;
public class BarServiceMock implements BarService 
    public String sayHello(String name) 
        // 你可以伪造容错数据,此方法只在出现RpcException时被执行
        return "容错数据";
    

这样在服务端出现异常的时候,客户端可以返回自己想返回的数据。

面试官:小伙子不错呀,什么时候能回北京入职呢

我:额。。。等等吧,现在还有好多家公司等着谈薪资呢,我得挑一家合适的。

面试官:你要多少我都给你,来我这吧

我:额。。。那就月薪100个W吧。

面试官:喂,你说什么我听不见,信号不好。。。

我:喂喂喂(嘟嘟嘟嘟嘟嘟嘟嘟。。。)。

二、总结

这里的相关内容还没有整理完毕,文章后面持续更新,建议收藏。

文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。

如果觉得我的文章还不错的话就点个赞吧,另外可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】更有我为大家准备的福利哟!回复【项目】有我为大家准备的一些项目源码。回复【简历模板】有我为大家准备的简历模板。

以上是关于Dubbo本地存根是什么,Dubbo本地伪装又是什么?的主要内容,如果未能解决你的问题,请参考以下文章

dubbo的本地存根(Stub)

dubbo用户指南

dubbo之本地存根

10.Dubbo配置-重试,超时(集群容错),启动检查,多版本,本地存根

dubbo源码阅读-ProxyFactory之StubProxyFactoryWrapper本地存根

Dubbo如何支持本地调用?InJvm方式解析