文章目录

  • 1. 名词解释
    • 本地存根
    • 本地伪装
  • 2. 作用
  • 3. 例子
  • 参考

1. 名词解释

本地存根

消费端实现一个装饰器类, 实现服务接口并持有服务接口的引用, 代理远程接口, 强化接口功能, 相当于Aop的around, 可以在真正调用远程接口前做参数校验, 后做结果缓存等额外的操作

一般我们系统中集成二方三方远程接口时, 都会对接口做一层封装, 以满足我们当前系统的规范, 通常这里都会做参数校验, 异常处理等操作, 和本地存根一致

本地伪装

消费端实现服务接口, 当消费端调用服务最终失败时, 在没有对服务调用使用 try-catch 包裹的情况下, 也能够返回一个预设默认值

2. 作用

典型的 RPC 调用客户端是依赖并且只依赖接口编程来进行远程调用的。在真正发起远程调用之前,用户往往需要做一些预处理的工作,比如提前校验参数。在拿到返回调用结果之后,用户可能需要缓存结果,或者是在调用失败的时候构造容错数据,而不是简单的抛出异常。

这个时候,用户可以编写出类似以下的代码来处理上面提出的这些场景:

try {preProcess();return service.invoke(...);
} catch (Throwable e) {return mockValue;
} finally {postProcess();
}

类似的,用户也可以通过面向切面编程 AOP 的高级技巧来解决上面的诉求,比如通过 Spring AOP 的方式可以通过类似下面的这段配置来完成。使用 AOP 的技巧相比上面的代码来说,避免了容错处理等与业务无关的代码对业务代码的侵入,使得业务处理主逻辑更简洁。

<bean id="demo-service-stub" class="org.apache.dubbo.demo.DemoServiceStub"/>
<bean id="demo-service-mock" class="org.apache.dubbo.demo.DemoServiceMock"/>
<aop:config><aop:aspect id="stub" ref="demo-service-stub"><aop:pointcut id="stubPointcut" expression="execution(* org.apache.dubbo.samples.DemoService+.*(..))"/><aop:before method="preProcess" pointcut-ref="stubPointcut"/><aop:after-returning method="postProcess" pointcut-ref="stubPointcut"/></aop:aspect><aop:aspect id="mock" ref="demo-service-mock"><aop:pointcut id="mockPointcut" expression="execution(* org.apache.dubbo.samples.DemoService+.*(..))"/><aop:after-throwing method="mock" pointcut-ref="mockPointcut"/></aop:aspect>
</aop:config>

为了进一步的方便用户做 Dubbo 开发,框架提出了本地存根 Stub 和本地伪装 Mock 的概念。通过约定大于配置的理念,进一步的简化了配置,使用起来更加方便,并且不依赖额外的 AOP 框架就达到了 AOP的效果。

  • 本地存根的工作方式与 AOP 的 around advice 类似,
  • 而本地伪装的工作方式等同于 AOP 中的 after-throwing advice,也就是说,只有当远程调用发生 exception 的时候才会执行本地伪装。

本地存根和本地伪装的工作流程如下图所示:

  • 服务消费者发起调用
  • 如果服务消费者端存在本地存根 Stub 的话,会先执行本地存根
  • 本地存根 Stub 持有远程服务的 Proxy 对象,Stub 在执行的时候,会先执行自己的逻辑 (before),然后通过 Proxy 发起远程调用,最后在返回过程之前也会执行自己的逻辑 (after-returning)
  • 如果远程服务的 Proxy 对象在执行过程中抛出了 exception,会执行服务消费端的本地伪装 Mock 的逻辑 (after-throwing),返回容错数据,从而达到服务降级的目的

3. 例子

详见《Dubbo 本地存根和本地伪装》

参考

Dubbo 本地存根和本地伪装
本地存根 官网 v2.7
本地伪装 官网 v2.7

【RPC Dubbo】本地存根和本地伪装相关推荐

  1. Dubbo(十二)dubbo的服务版本配置以及本地存根使用介绍

    一.接口服务多版本管理 在实际项目场景中在发布生产之前会存在一个过渡的灰度版本环境,dubbo也一样在接口服务升级时,可以实现两个版本的服务接口,指定不同的版本号.当少量的消费端调用引用高版本后使用无 ...

  2. Dubbo 本地存根

    场景: 当我们执行远程服务调用时,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 St ...

  3. chrome调试本地项目, 引用本地javascript文件

    chrome调试本地项目, 引用本地javascript文件 本地文件可以访问本地文件 修改快捷方式属性 C:\Users\xxx\AppData\Local\Google\Chrome\Applic ...

  4. Android9.0 本地时区和本地时间的自动更新机制

    Android9.0 本地时区和本地时间的自动更新机制 简介 现在Android通过网络同步时间有两种方式:NITZ和NTP,它们使用的条件不同,可以获取的信息也不一样:勾选自动同步功能后,手机首先会 ...

  5. 什么,你不会Windows本地账户和本地组账户的管理加固?没意思

    什么,你不会Windows本地账户和本地组账户的管理加固?没意思 1.图形化界面方式管理用户 2.图形化界面方式管理用户组 3.命令行界面方式管理用户 4.命令行界面方式管理账户组 5.账户安全基线加 ...

  6. C# Umeditor 编辑器上传本地视频、本地文件

    Umeditor 最近在做一个网站,涉及到网站文章的编辑.Umeditor是一个很好的选择,但是看了一下Umeditor,发现不能上传本地视频和本地文件,而项目又要得比较急,所以以我觉得最快的方式修改 ...

  7. 计算机中的组和用户名好多是干什么用的,什么是本地用户和本地组

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 以电脑为例,本地用户和本地组是位于计算机管理中,用户可以使用这一组管理工具来管理单台本地或远程计算机.可以使用本地用户和组保护并管 ...

  8. 使用iso镜像包制作离线本地镜像源(本地yum源)

    记录:307 场景:在CentOS 7.9操作系统,使用iso包制作本地镜像源(本地yum源).搭建httpd发布服务,实现一台机器制作本地镜像源,集群内所有机器共用本地镜像源(本地yum源).内网集 ...

  9. 使用git下载项目到本地,指定本地文件夹位置的三种方式

    使用git下载项目到本地,指定本地文件夹位置的三种方式 使用VSCODE里的"克隆"功能直接粘贴项目链接即可选择本地想保存的位置. 使用git bash窗口下载项目之前,先切换到你 ...

  10. Centos7.5使用本地iso文件创建本地源,实现安装源中已经打包存在的软件

    使用本地iso文件创建本地源,实现安装源中已经打包存在的软件 1.确定本地有iso文件 eg:CentOS-7-x86_64-Everything-1804.iso2.将iso文件进行挂载 ,指定挂载 ...

最新文章

  1. java exception用法_JavaException的使用
  2. Tomcat(四):tomcat图形管理和身份认证
  3. 《Java 核心技术卷1 第10版》学习笔记------对象克隆【对象拷贝】
  4. php提交后清楚表单缓存,PHP提交表单后如何控制缓存 | 学步园
  5. 今天的编程语言是怎么来的?
  6. CLI下的网页浏览器之二——Lynx
  7. 机器学习08机器学习系统设计
  8. 自然语言处理的未来之路(周明老师,CCF-GRIR,笔记)
  9. 澳大利亚计算机领域的科学家,澳科学家首创硅基元件 突破量子计算机制造瓶颈...
  10. 寻路之 A* 搜寻算法
  11. 团队管理13--设定工作目标
  12. 升级yosemite后java出错的解决
  13. latex常见实用网址链接
  14. Android Studio如何导出apk文件
  15. Microsoft Word2010 中设置和取消英文首字母大写
  16. matlab三个坐标,[MATLAB基础] 画有一个有xyz三个坐标的图
  17. Vim中文本全部选中
  18. MSP430初学:MSP430单片机C语言基础(二)
  19. html样式表是不是css,css样式是什么
  20. 开源究竟有什么魅力?听完这 4 个故事你也许会明白

热门文章

  1. 皇家骑士团 100问
  2. 清除input的历史记录
  3. 超越前作,实现动漫风格迁移——AnimeGANv2
  4. PHP 获取格式化的日期和时间
  5. 银河麒麟V10安装ASP.NET Core教程
  6. 互联网背景下为什么会出现NoSQL?
  7. 成功解决AttributeError: ‘Series‘ object has no attribute ‘split‘
  8. 关于win10 无线网络不可用,网络适配器出现全感叹号
  9. 什么是结构化数据、半结构化数据、非结构化数据
  10. MongoDB分片机制