Thrift解读(五)——server端RPC接收与返回值的回送
Thrift框架主要分为四层:Service,Protocol,Transport,Server。前述介绍的TNonBlockingServer就是一种Server,除此之外,还有很多别的Server,比TNonBlockingServer要简单的多,以后会简要介绍其中的一两个。Service由程序员自己编写,是实际的RPC调用体。还剩中间俩:Protocol是对函数调用的名称、参数、返回值的序列化和反序列化协议,最常见的是TBinaryProtocol;Transport是数据传送的方式,比如TFramedTransport,他TCP字节流分为一个个的帧,在帧数据前面加上长度作为帧头部。这两个都非常枯燥,这里用一个例子来说明从Server是如何调用到Service的实现的。
比如程序员在Thrift声明的服务叫XXX,那么程序员需要实现一个XXXHandler的类,并且这个类要继承XXXIf类。同时,Thrift会帮我们生成一个角XXXProcessor的类,构建Server的时候,需要将这个XXXProcessor的实例或者工厂传递构造方法。这个XXXIf会保存在XXXProcessor对象中。XXXProcessor本身没有process方法,但是它继承自TDispatchProcessor类,TConnection的Task调用process方法,实际调用的就是TDispatchProcessor的process。这个process首先通过Protocol协议的readMessageBegin方法,从接收的消息中读取RPC方法调用名,然后调用dispatchCall方法。这个方法是个纯虚方法,因此调用的实际上是XXXProcessor的dispatchCall方法,代码段又回到了XXXProcessor。
执行过程如下:
1. 从processMap_寻找RPC调用实际上调用的哪个函数,比如原来Thrift声明这个服务有方法YYY(非oneway),而且客户端发起RPC调用的就是YYY。那么寻找的结果为XXXProcessor的process_YYY函数并且调用。
2. 如果之前设置了TProcessEventHandler,那么调用getContext获取调用上下文。
3. 声明上下文的销毁:TProcessorContextFreer对象。process_YYY退出时候,TProcessorContextFreer会被析构,此时会调用freeContext方法。
4. 读取参数:readStructBegin --> (Loop:readFieldBegin读取type --> read具体数据 --> readFieldEnd) --> readStructEnd
5. readMessageEnd。结束读取输入。如果之前设置了TProcessEventHandler,在3、4的前后会调用preRead和postRead。
6. 调用XXXIf实例的YYY方法。设置返回值的.__isset.success=true
7. writeMessageBegin
8. 如果发生异常,写入异常,以及调用其他end函数和flush。一般不要在Thrift声明异常。
9. writeMessageBegin
10. 写入返回值:writeStructBegin --> (如果之前标记了.__isset.success,writeFieldBegin --> write具体数据 --> writeFieldEnd) --> writeFieldStop --> writeStructEnd
11. writeMessageEnd
12. getTransport()->writeEnd()
13. getTransport()->flush()
14. 如果之前设置了TProcessEventHandler,那么在9之前和13之后还会调用preWrite和postWrite。
需要注意的是,getContext的ServerContext是在TConnection调用process之前调用getServerContext时候做的。所以如果需要使用ServerContext,还需要设置并实现XoaServerEventHandler。
Server的介绍基本上可以成为一个小体系了,那么接下来一节,我们主要研究Client的逻辑。
转载于:https://blog.51cto.com/luckybins/1344850
Thrift解读(五)——server端RPC接收与返回值的回送相关推荐
- Go rpc调用的返回值
Go 语言RPC定义格式如下: func (t *T) MethodName(argType T1, replyType *T2) error 第一个参数是接收的参数,第二个参数是返回给客户端的参数, ...
- BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题
BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 参考文章: (1)BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 (2)https://www. ...
- SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例
SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例 原文:SQL SERVER CHAR ( integer_expression )各版本返回值差异的 ...
- linux变量接收命令返回值,Linux Shell教程(一)
函数返回值 函数返回值,可以显式增加return语句:如果不加,会将最后一条命令运行结果作为返回值. 函数返回值在调用该函数后通过 $? 来获得. 范例1 来看一个带有return语句的函数: #!/ ...
- ASP.Net MVC 在ajax接收controller返回值为Json数据
首先,再次回忆一下ajax的标准用法:(这张图写的比较详细了)(转) 页面部分ajax代码: $.ajax({ url: "/Home/Login?account=& ...
- .net 调用 sql server 自定义函数,并输出返回值
数据库结构: 表内的数据: 自定义函数: 递归查出 树下所有节点 ,参数是 父id create function sss(@id as int)returns @t table(id int not ...
- Hadoop中RPC机制详解之Server端
2019独角兽企业重金招聘Python工程师标准>>> Hadoop 中 RPC 机制详解之 Client 端 1. Server.Listener RPC Client 端的 RP ...
- 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定
上一篇文章学习了几种函数调用约定的区别,点击链接查看上一篇文章:[软件开发底层知识修炼]二十四 ABI之函数调用约定 本篇文章继续学习函数调用约定中,关于函数返回值的问题.当函数返回值为结构体时,函数 ...
- Hadoop基于Protocol Buffer的RPC实现代码分析-Server端--转载
原文地址:http://yanbohappy.sinaapp.com/?p=110 最新版本的Hadoop代码中已经默认了Protocol buffer(以下简称PB,http://code.goog ...
最新文章
- ML之SSIM:基于输入图片RGB的三维向量利用SSIM(结构相似性度量)算法进行判别
- Redis源码剖析(九)对象系统概述
- iframe出现双层滚动条解决方案
- java实用教程——组件及事件处理——DocumentEvent事件
- jmeter根据循环获取参数_Jmeter--同线程组循环获取数据库数据传递请求
- 如何强制卸载edge_如何卸载微软Windows10自带的Edge浏览器?试试这个方法
- “应用程序无法正常启动 0xc0150002”如何解决?
- 英语口语收集(三十七)
- Html5 打砖块游戏,加入道具和速通模式(含源码)
- Fiddler+雷电模拟器APP抓包
- 安克创新能否锚定全球家用储能市场 隆起新的增长极?
- php如何留后门,ThinkPHP留后门技巧
- PhD Debate-8 | 迈向常识知识的高级语义理解
- 【STM32F429的DSP教程】第12章 DSP基础函数-相反数,偏移,移位,减法和比例因子
- 使用ROS2机器人操作系统进行多机器人编程技术实践(Multi-Robot Programming Via ROS2 )
- 关于ansys阶跃载荷与斜坡载荷
- Object.assign()详解
- 江西初中生学计算机,江西中专学校初中毕业学计算机专业好吗
- 《计算机工程与应用》42天录用经历
- 在Ubuntu中搭建nfs服务,使用X210开发板在uboot中用nfs加载系统测试