博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dubbo特性之本地存根、本地伪装和隐式参数传递
阅读量:4185 次
发布时间:2019-05-26

本文共 2632 字,大约阅读时间需要 8 分钟。

文章目录

本地存根

  • 本地存根类似于Dubbo的静态代理。
  • dubbo会在客户端生成一个代理。
  • stub必须有可传入Proxy的函数。
    在这里插入图片描述
    远程服务后,客户端通常只剩下接口,而实现全在服务端,但提供方有些时候想在客户端也执行部分逻辑,比如:做ThreadLocal缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在API中带上Stub,客户端生成Proxy实例,会把Proxy通过构造函数传给stub, 然后把Stub暴露给用户,stub可以决定要不要去调Proxy。

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

提供Stub的实现,在interface旁边放一个Stub的实现,它实现BarService接口,并有一个传入远程BarService实例的构造函数。

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 "容错数据";        }    }}

本地伪装

  • 本地伪装是本地存根的一个子集。
  • 通常会使用本地伪装处理服务降级。
  • 建议本地伪装在客户端实现。

本地伪装通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过Mock数据返回授权失败。Mock只能捕获RpcException 类。

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

 

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

 

在工程中提供 Mock 实现 , 在interface旁边放一个Mock实现,它实现BarService接口,并有一个无参构造函数。

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

如果服务的消费方经常需要 try-catch 捕获异常,如:

Offer offer = null;try {    offer = offerService.findOffer(offerId);} catch (RpcException e) {   logger.error(e);}

请考虑改为 Mock 实现,并在 Mock 实现中 return null。如果只是想简单的忽略异常,在 2.0.11 以上版本可用:

进阶用法

return

使用return来返回一个字符串表示的对象,作为Mock的返回值。合法的字符串可以是:

  • empty: 代表空,基本类型的默认值,或者集合类的空值
  • null: null
  • true: true
  • false: false
  • JSON 格式: 反序列化 JSON 所得到的对象
throw

使用 throw 来返回一个 Exception 对象,作为 Mock 的返回值。

当调用出错时,抛出一个默认的 RPCException:

当调用出错时,抛出指定的 Exception:

force 和 fail

在 2.6.6 以上的版本,可以开始在 Spring XML 配置文件中使用 fail: 和 force:。force: 代表强制使用 Mock 行为,在这种情况下不会走远程调用。fail: 与默认行为一致,只有当远程调用发生错误时才使用 Mock 行为。force: 和 fail: 都支持与 throw 或者 return 组合使用。

强制返回指定值:

强制抛出指定异常:

在方法级别配置 Mock

Mock 可以在方法级别上指定,假定 com.foo.BarService 上有好几个方法,我们可以单独为 sayHello() 方法指定 Mock 行为。具体配置如下所示,在本例中,只要 sayHello() 被调用到时,强制返回 “fake”:

隐式参数

可以通过RpcContext 上的setAttachmentgetAttachment在这里插入代码片在服务消费方和提供方之间进行参数的隐式传递。

在这里插入图片描述

在服务消费方端设置隐式参数

setAttachment 设置的 KV 对,在完成下面一次远程调用会被清空,即多次远程调用要多次设置。

RpcContext.getContext().setAttachment("index", "1"); // 隐式传参,后面的远程调用都会隐式将这些参数发送到服务器端,类似cookie,用于框架集成,不建议常规业务使用xxxService.xxx(); // 远程调用// ...
在服务提供方端获取隐式参数
public class XxxServiceImpl implements XxxService {     public void xxx() {        // 获取客户端隐式传入的参数,用于框架集成,不建议常规业务使用        String index = RpcContext.getContext().getAttachment("index");     }}

转载地址:http://abfoi.baihongyu.com/

你可能感兴趣的文章
Windows 10完美识别3TB硬盘实录
查看>>
在CentOS 6.x上安装luajit 2.0.4
查看>>
Linux下使用diff和patch制作及打补丁(已经实践可行!)
查看>>
ThinkPad T420更换SSD实录
查看>>
在Ubuntu 16.04.1 LTS上安装ats 5.3.2
查看>>
在CentOS 6.8 x86_64上安装ATS 6.2.1实录
查看>>
在CentOS 6.9 x86_64上玩转OpenResty 1.13.6.1中的resty-cli模块
查看>>
Spring中的Bean是有生命周期
查看>>
FreeMarker是一个用Java语言编写的模板引擎
查看>>
Markdown的语法简洁明
查看>>
hadoop的部署总共有3种类型
查看>>
部署安装hadoop
查看>>
sqoop是什么
查看>>
使用eclipse来调试hadoop作业是非常简洁方便的,
查看>>
配置sqoop的环境变量
查看>>
Optional类包含的方法
查看>>
如何使用MR来读取数据库的数据,并写入HDFS上
查看>>
mapred-site.xml里面配置运行日志的输出目录
查看>>
DistributedCache是Hadoop的一个分布式文件缓存类
查看>>
FileSplit:文件的子集--文件分割体
查看>>