今晚心情无比激动,多云转晴!原因在于弄懂些 Generic Service 实现原理,很有成就感。

各位看官莫笑,今晚,小小的收获,也是非常满足的。下面进入正题!

一、前言

普遍RPC在客户端需要提供接口,如果不提供则无法进行调用。同时,因为客户端也依赖提供的接口,服务端的升级、优化所带来的更新,客户端也要及时的更新API,否则会带来影响。这样,就带来了依赖接口,常常更新API(接口)的麻烦。为了解决这个问题,需要进行泛化调用。

二、使用

在网上一搜,都是Dubbo的泛化调用的例子,可以很少有讲解它的原理的。也不能为了用个泛化调用,就一定要使用Dubbo吧(个人观点:淘宝内部放弃Dubbo,此外配置繁琐,没有人维护,所以不建议使用)。适合的才是最好的,不能生搬硬套。

我google一下,后来发现sofa-rpc框架,里面有泛化调用(在此推荐大家使用sofa-rpc,具体介绍,自己google),下载源码,debug跟着走几遍,Generic Service 实现原理弄懂了。

demo片段如下(下载sofa-rpc的源码,里面有demo):

 ConsumerConfig<GenericService> consumerConfig = new ConsumerConfig<GenericService>()
.setApplication(applicationConfig)
.setInterfaceId(TestGenericService.class.getName())
.setGeneric(true)
.setTimeout(50000)
.setDirectUrl("bolt://127.0.0.1:22222?appName=generic-server");
GenericService testService = consumerConfig.refer();
// 上面这行中,生成GenericService的动态代理类 LOGGER.warn("started at pid {}", RpcRuntimeContext.PID); while (true) {
try {
String s1 = (String) testService.$invoke("echoStr", new String[] { "java.lang.String" },
new Object[] { "1111" });

(本文只分析泛化调用的部分,其余部分略过)

三、原理

它的原理无非就是将泛化调用转化为普通调用,关键在于对象的表示和序列化。

看一下流程图:

首先,Client会通过动态代理创建GenericService的代理类;

然后,会经过一系列过滤链(优先级排序,默认不需要,大的优先级高)

ConsumerExceptionFilter     order = -20000
RpcReferenceContextFilter  order = -19500
ConsumerGenericFilter        order = -18000
ConsumerTracerFilter           order = -10000
ConsumerInvoker           这里会进行真正的业务的调用

在泛化调用过滤器(ConsumerGenericFilter)中,会进行下列操作:

★设置序列化工厂类型为普通序列化(序列化反序列化均使用SofaSerializerFactory,值为0),并设置到Request参数中。

★进行调用参数($invoke参数)的修正,变成普通的调用参数(调用方法,调用参数类型,调用参数值)

★设置调用类型

最后,使用SOFABolt协议进行进行网络调用。

-----------------------------------------------------------------------------------

SOFARPC —— Generic Service (泛化调用) 解析的更多相关文章

  1. dubbo的泛化调用研究

    结论: 泛化调用需要继承一个类,在配置文件里需要明确指出generic=true; 泛化调用在书写provider代码时,变化不大: 泛化调用和普通调用的区别主要在consumer,从‘调用’的表面意 ...

  2. Dubbo基本特性之泛化调用

    Dubbo 是支持泛化调用的,什么是泛化调用呢?泛化调用的好处是什么呢,泛化调用说白一点就是服务消费者并没有服务的接口. 在<Dubbo入门-搭建一个最简单的Demo框架>一文中,我们已完 ...

  3. dubbo接口泛化调用例子

    @ApiOperation(value = "dubbo泛化调用工具接口") public Result dubboApiTool( @ApiParam(value = " ...

  4. Dubbo高级特性实践-泛化调用

    引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

  5. SOFA 源码分析 — 泛化调用

    前言 通常 RPC 调用需要客户端使用服务端提供的接口,而具体的形式则是使用 jar 包,通过引用 jar 包获取接口的的具体信息,例如接口名称,方法名称,参数类型,返回值类型. 但也存在一些情况,例 ...

  6. Dubbo学习笔记4:服务消费端泛化调用与异步调用

    本文借用dubbo.learn的Dubbo API方式来解释原理. 服务消费端泛化调用 前面我们讲解到,基于Spring和基于Dubbo API方式搭建简单的分布式系统时,服务消费端引入了一个SDK二 ...

  7. pinpoint-dubbo插件兼容泛化调用

    背景 dubbo插件中需要记录当前调用的接口和方法,但是在泛化调用的场景下,记录的接口和方法都变成了 com.alibaba.dubbo.rpc.service.GenericService:$inv ...

  8. Dubbo 高级特性实践-泛化调用

    引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...

  9. Dubbo中@Service工作过程解析

    Dubbo中@Service工作过程解析 Spring中的BeanPostProcessor 首先我们应当了解到在spring体系中BeanPostProcessor是什么.加载流程 它是什么 Bea ...

随机推荐

  1. 【js高程学习笔记】关于变量值和函数参数

    变量包含了两种不同类型的值: 基本类型 (Undefined.null.Boolean.Number.string都属于基本类型) 引用类型 (对象) 两种值在赋值上不同的是: 将一个引用类型的值(对 ...

  2. DevExpress v18.2版本亮点——Reporting篇(三)

    行业领先的.NET界面控件——DevExpress v18.2日前正式发布,本站将以连载的形式为大家介绍新版本新功能.本文将介绍了DevExpress Reporting v18.2 的新功能,新版3 ...

  3. 解决linux root 认证失败的问题

    https://jingyan.baidu.com/article/3052f5a1f1b17c97f31f8688.html

  4. document.onkeydown

    document.onkeydown=function(e) { if(e.keyCode==13) { //当按下回车键,执行我们的代码 } }

  5. java关于redis的快速配置

    1.关于Jedis安装配置很简单,我主要写一个,能够快速使用redis的工具类,首先导入依赖, 就一个 jedis 最好选用老一点版本 <!-- https://mvnrepository.co ...

  6. more语法

    二.more 文件内容或输出查看工具 more 是我们最常用的工具之一,最常用的就是显示输出的内容,然后根据窗口的大小进行分页显示,然后还能提示文件的百分比: [root@localhost ~]# ...

  7. vue项目中如何使用less

    首先你的vue-cli下载完成 第一步   安装less-loader  依赖 npm  install  less less-loader  --save-dev 直接自动就配置上了,不用手动配置 ...

  8. 2018-计算机系机试-A

    #include<stdio.h> #include<cstdio> #include<cmath> #include<cstring> #includ ...

  9. oracle导入导出功能

    1.普通版:oracle导入导出功能:导出exp 用户名/密码@SID file=f:\xx.dmp owner=用户名 导入imp 用户名/密码@SID full=y file=f:\xx.dmp ...

  10. centos7 安装mysql出现Could NOT find Curses (missing CURSES_LIBRARY CURSES_INCLUDE_PATH)

    今天安装mysql 5.7 编译时出现一下问题: [root@localhost software]# cd mysql-5.7.21 [root@localhost mysql-5.7.21]# c ...