【RPC Dubbo】本地存根和本地伪装
文章目录
- 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】本地存根和本地伪装相关推荐
- Dubbo(十二)dubbo的服务版本配置以及本地存根使用介绍
一.接口服务多版本管理 在实际项目场景中在发布生产之前会存在一个过渡的灰度版本环境,dubbo也一样在接口服务升级时,可以实现两个版本的服务接口,指定不同的版本号.当少量的消费端调用引用高版本后使用无 ...
- Dubbo 本地存根
场景: 当我们执行远程服务调用时,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 St ...
- chrome调试本地项目, 引用本地javascript文件
chrome调试本地项目, 引用本地javascript文件 本地文件可以访问本地文件 修改快捷方式属性 C:\Users\xxx\AppData\Local\Google\Chrome\Applic ...
- Android9.0 本地时区和本地时间的自动更新机制
Android9.0 本地时区和本地时间的自动更新机制 简介 现在Android通过网络同步时间有两种方式:NITZ和NTP,它们使用的条件不同,可以获取的信息也不一样:勾选自动同步功能后,手机首先会 ...
- 什么,你不会Windows本地账户和本地组账户的管理加固?没意思
什么,你不会Windows本地账户和本地组账户的管理加固?没意思 1.图形化界面方式管理用户 2.图形化界面方式管理用户组 3.命令行界面方式管理用户 4.命令行界面方式管理账户组 5.账户安全基线加 ...
- C# Umeditor 编辑器上传本地视频、本地文件
Umeditor 最近在做一个网站,涉及到网站文章的编辑.Umeditor是一个很好的选择,但是看了一下Umeditor,发现不能上传本地视频和本地文件,而项目又要得比较急,所以以我觉得最快的方式修改 ...
- 计算机中的组和用户名好多是干什么用的,什么是本地用户和本地组
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 以电脑为例,本地用户和本地组是位于计算机管理中,用户可以使用这一组管理工具来管理单台本地或远程计算机.可以使用本地用户和组保护并管 ...
- 使用iso镜像包制作离线本地镜像源(本地yum源)
记录:307 场景:在CentOS 7.9操作系统,使用iso包制作本地镜像源(本地yum源).搭建httpd发布服务,实现一台机器制作本地镜像源,集群内所有机器共用本地镜像源(本地yum源).内网集 ...
- 使用git下载项目到本地,指定本地文件夹位置的三种方式
使用git下载项目到本地,指定本地文件夹位置的三种方式 使用VSCODE里的"克隆"功能直接粘贴项目链接即可选择本地想保存的位置. 使用git bash窗口下载项目之前,先切换到你 ...
- Centos7.5使用本地iso文件创建本地源,实现安装源中已经打包存在的软件
使用本地iso文件创建本地源,实现安装源中已经打包存在的软件 1.确定本地有iso文件 eg:CentOS-7-x86_64-Everything-1804.iso2.将iso文件进行挂载 ,指定挂载 ...
最新文章
- java exception用法_JavaException的使用
- Tomcat(四):tomcat图形管理和身份认证
- 《Java 核心技术卷1 第10版》学习笔记------对象克隆【对象拷贝】
- php提交后清楚表单缓存,PHP提交表单后如何控制缓存 | 学步园
- 今天的编程语言是怎么来的?
- CLI下的网页浏览器之二——Lynx
- 机器学习08机器学习系统设计
- 自然语言处理的未来之路(周明老师,CCF-GRIR,笔记)
- 澳大利亚计算机领域的科学家,澳科学家首创硅基元件 突破量子计算机制造瓶颈...
- 寻路之 A* 搜寻算法
- 团队管理13--设定工作目标
- 升级yosemite后java出错的解决
- latex常见实用网址链接
- Android Studio如何导出apk文件
- Microsoft Word2010 中设置和取消英文首字母大写
- matlab三个坐标,[MATLAB基础] 画有一个有xyz三个坐标的图
- Vim中文本全部选中
- MSP430初学:MSP430单片机C语言基础(二)
- html样式表是不是css,css样式是什么
- 开源究竟有什么魅力?听完这 4 个故事你也许会明白
热门文章
- 皇家骑士团 100问
- 清除input的历史记录
- 超越前作,实现动漫风格迁移——AnimeGANv2
- PHP 获取格式化的日期和时间
- 银河麒麟V10安装ASP.NET Core教程
- 互联网背景下为什么会出现NoSQL?
- 成功解决AttributeError: ‘Series‘ object has no attribute ‘split‘
- 关于win10 无线网络不可用,网络适配器出现全感叹号
- 什么是结构化数据、半结构化数据、非结构化数据
- MongoDB分片机制