SOFARPC —— Generic Service (泛化调用) 解析
今晚心情无比激动,多云转晴!原因在于弄懂些 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 (泛化调用) 解析的更多相关文章
- dubbo的泛化调用研究
结论: 泛化调用需要继承一个类,在配置文件里需要明确指出generic=true; 泛化调用在书写provider代码时,变化不大: 泛化调用和普通调用的区别主要在consumer,从‘调用’的表面意 ...
- Dubbo基本特性之泛化调用
Dubbo 是支持泛化调用的,什么是泛化调用呢?泛化调用的好处是什么呢,泛化调用说白一点就是服务消费者并没有服务的接口. 在<Dubbo入门-搭建一个最简单的Demo框架>一文中,我们已完 ...
- dubbo接口泛化调用例子
@ApiOperation(value = "dubbo泛化调用工具接口") public Result dubboApiTool( @ApiParam(value = " ...
- Dubbo高级特性实践-泛化调用
引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...
- SOFA 源码分析 — 泛化调用
前言 通常 RPC 调用需要客户端使用服务端提供的接口,而具体的形式则是使用 jar 包,通过引用 jar 包获取接口的的具体信息,例如接口名称,方法名称,参数类型,返回值类型. 但也存在一些情况,例 ...
- Dubbo学习笔记4:服务消费端泛化调用与异步调用
本文借用dubbo.learn的Dubbo API方式来解释原理. 服务消费端泛化调用 前面我们讲解到,基于Spring和基于Dubbo API方式搭建简单的分布式系统时,服务消费端引入了一个SDK二 ...
- pinpoint-dubbo插件兼容泛化调用
背景 dubbo插件中需要记录当前调用的接口和方法,但是在泛化调用的场景下,记录的接口和方法都变成了 com.alibaba.dubbo.rpc.service.GenericService:$inv ...
- Dubbo 高级特性实践-泛化调用
引言 当后端Java服务用Dubbo协议作为RPC方案的基础,但部分消费方是前端Restful的PHP服务,不能直接调用,于是在中间架设了Router服务提供统一的基于HTTP的后端调用入口. 而Ro ...
- Dubbo中@Service工作过程解析
Dubbo中@Service工作过程解析 Spring中的BeanPostProcessor 首先我们应当了解到在spring体系中BeanPostProcessor是什么.加载流程 它是什么 Bea ...
随机推荐
- 未知高度的div自适应图片高度
<div style="background-image: url(http://your-image.jpg);"> <img src="http:/ ...
- 26. Remove Duplicates from Sorted Array★
题目内容: Given a sorted array, remove the duplicates in place such that each element appear only once a ...
- *args和**kwargs的区别
*args和**kwargs表示可变长度的参数. *args是元组类型: **kwargs是字典类型: 注意:arg.*args.**kwargs三个参数的位置必须是固定的,否则会报错.
- SQL-52 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列
题目描述 获取Employees中的first_name,查询按照first_name最后两个字母,按照升序进行排列CREATE TABLE `employees` (`emp_no` int(11) ...
- cookie和sesssion
一.cookie cookie和session都可以暂时保存在多个页面中使用的变量,但是它们有本质的差别. cookie存放在客户端浏览器中,session保存在服务器上.它们之间的联系是sessio ...
- AJAX 解决什么问题?如何使用AJAX?AJAX 有什么问题需要注意?项目中哪里用到了AJAX?
ajax 解决的问题就是“无刷新更新页面”,用传统的HTML 表单方式进行页面的更新时,每次都要将请求提交到服务器,服务器返回后再重绘界面,这样界面就会经历:提交→变白→重新显示这样一个过程,用户体验 ...
- Mac下部署Ionic环境
1.下载安装nodejs,可以到官网http://nodejs.org/en/download/上去下载最新版本安装,比较无脑.如果官网打不开的话可以到中文网站去下载http://nodejs.cn/ ...
- 【Shell】单行注释和多行注释
单行注释 '# ' # echo "hello" 多行注释 方法1 : << ! 这是注释1 这是注释2 这是注释3 ! 方法2 :' 这是注释1 这是注释2 这是注释 ...
- web项目中web.xml简介
什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没 ...
- 不会点git真不行啊.
基本使用: // 进入项目根目录, git init // 接管你的项目文件夹, git status // 查看状态. 绿色已接管,红色未管理 git add . // 添加管理当前目录所有文件及子 ...