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接收与返回值的回送相关推荐

  1. Go rpc调用的返回值

    Go 语言RPC定义格式如下: func (t *T) MethodName(argType T1, replyType *T2) error 第一个参数是接收的参数,第二个参数是返回给客户端的参数, ...

  2. BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题

    BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 参考文章: (1)BeginInvoke与EndInvoke方法解决多线程接收委托返回值问题 (2)https://www. ...

  3. SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例

    SQL SERVER CHAR ( integer_expression )各版本返回值差异的案例 原文:SQL SERVER CHAR ( integer_expression )各版本返回值差异的 ...

  4. linux变量接收命令返回值,Linux Shell教程(一)

    函数返回值 函数返回值,可以显式增加return语句:如果不加,会将最后一条命令运行结果作为返回值. 函数返回值在调用该函数后通过 $? 来获得. 范例1 来看一个带有return语句的函数: #!/ ...

  5. ASP.Net MVC 在ajax接收controller返回值为Json数据

    首先,再次回忆一下ajax的标准用法:(这张图写的比较详细了)(转) 页面部分ajax代码: $.ajax({             url: "/Home/Login?account=& ...

  6. .net 调用 sql server 自定义函数,并输出返回值

    数据库结构: 表内的数据: 自定义函数: 递归查出 树下所有节点 ,参数是 父id create function sss(@id as int)returns @t table(id int not ...

  7. Hadoop中RPC机制详解之Server端

    2019独角兽企业重金招聘Python工程师标准>>> Hadoop 中 RPC 机制详解之 Client 端 1. Server.Listener RPC Client 端的 RP ...

  8. 【软件开发底层知识修炼】二十五 ABI之函数调用约定二之函数返回值为结构体时的约定

    上一篇文章学习了几种函数调用约定的区别,点击链接查看上一篇文章:[软件开发底层知识修炼]二十四 ABI之函数调用约定 本篇文章继续学习函数调用约定中,关于函数返回值的问题.当函数返回值为结构体时,函数 ...

  9. Hadoop基于Protocol Buffer的RPC实现代码分析-Server端--转载

    原文地址:http://yanbohappy.sinaapp.com/?p=110 最新版本的Hadoop代码中已经默认了Protocol buffer(以下简称PB,http://code.goog ...

最新文章

  1. ML之SSIM:基于输入图片RGB的三维向量利用SSIM(结构相似性度量)算法进行判别
  2. Redis源码剖析(九)对象系统概述
  3. iframe出现双层滚动条解决方案
  4. java实用教程——组件及事件处理——DocumentEvent事件
  5. jmeter根据循环获取参数_Jmeter--同线程组循环获取数据库数据传递请求
  6. 如何强制卸载edge_如何卸载微软Windows10自带的Edge浏览器?试试这个方法
  7. “应用程序无法正常启动 0xc0150002”如何解决?
  8. 英语口语收集(三十七)
  9. Html5 打砖块游戏,加入道具和速通模式(含源码)
  10. Fiddler+雷电模拟器APP抓包
  11. 安克创新能否锚定全球家用储能市场 隆起新的增长极?
  12. php如何留后门,ThinkPHP留后门技巧
  13. PhD Debate-8 | 迈向常识知识的高级语义理解
  14. 【STM32F429的DSP教程】第12章 DSP基础函数-相反数,偏移,移位,减法和比例因子
  15. 使用ROS2机器人操作系统进行多机器人编程技术实践(Multi-Robot Programming Via ROS2 )
  16. 关于ansys阶跃载荷与斜坡载荷
  17. Object.assign()详解
  18. 江西初中生学计算机,江西中专学校初中毕业学计算机专业好吗
  19. 《计算机工程与应用》42天录用经历
  20. 在Ubuntu中搭建nfs服务,使用X210开发板在uboot中用nfs加载系统测试

热门文章

  1. 曾在字节实习的程序员小姐姐,教你一步提取动漫线稿!比用PS更清晰
  2. Deepfake这次不换脸了,直接换了座城市
  3. 在网易有道做语音算法工程师是一种怎样的体验?
  4. 还在担心工作被AI取代?不如掌握这门硬实力,抢占职场发展机遇
  5. 安卓用户又少了一项自由,Android 11不再支持更改默认相机程序
  6. 去除ArcMap连接空间数据库中多余的属性表
  7. MySql模糊查询中特殊字符处理
  8. 第 4 章 Hypertable
  9. Rapid7警告声明:远程桌面协议(RDP)暴露数百万 Windows 终端
  10. Eclipse调试Debug技巧