之前写过两篇关于 Thrift 的相关文章。

  • Thrift源码剖析
  • Thrift异步IO服务器源码分析

也算是对Thrift比较熟悉,不过对 Thrift 里面的 Protocol 部分还是黑盒使用。 虽然大概能猜到具体实现方式,但是还是忍不住花了一点点时间把具体代码实现翻出来看看。 主要是为了满足一下好奇心。

简单搞了一个Thrift的描述文件Insight.thrift作为例子。

struct Person {1: string name,2: i32 age,3: optional string address,
}service Insight {Person Hello(1: Person person),Person Hi(1: Person p1, 2: Person p2),
}

然后通过 毕竟Thrift其实就是干RPC的活,所以看源码就按着RPC远程调用的顺序来看就行。

从Hello函数调用开始,InsightClient::Hello 可以看出, 在每次RPC调用的时候,会先将函数名通过writeMessageBegin(“Hello”, ::apache::thrift::protocol::T_CALL, cseqid) 先发送过去。 这个过程的序列化协议很简单,直接就是传输的函数名字符串。 然后再发送参数。 发送参数的时候,会将所有参数作为一个 struct 发送 Insight_Hello_pargs,

所以协议的序列化过程主要都是体现在 struct 的序列化上面。 比如像Hi函数的参数序列化过程:

uint32_t Insight_Hi_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const {uint32_t xfer = 0;xfer += oprot->writeStructBegin("Insight_Hi_pargs");xfer += oprot->writeFieldBegin("p1", ::apache::thrift::protocol::T_STRUCT, 1);xfer += (*(this->p1)).write(oprot);xfer += oprot->writeFieldEnd();xfer += oprot->writeFieldBegin("p2", ::apache::thrift::protocol::T_STRUCT, 2);xfer += (*(this->p2)).write(oprot);xfer += oprot->writeFieldEnd();xfer += oprot->writeFieldStop();xfer += oprot->writeStructEnd();return xfer;
}

整个对象的序列化过程主要是依赖了接口 TProtocol 的函数。

对于实现 TProtocol 接口的序列化实现主要是以下三种(在thrift-0.9.0/lib/cpp/src/thrift/protocol里):

  • TBinaryProtocol
  • TCompactProtocol
  • TJSONProtocol

要了解协议序列化过程主要看一下 TBinaryProtocol 和 TCompactProtocol 就够了。

主要是如下几个关键点:

  • 其实 writeStructStruct 和 writeStructEnd 啥屁事也不用做。
  • 其实 writeFieldBegin 只有后两个参数有用,第二个参数是类型,第三个参数是ID, 因为光靠这两者就可以在反序列化(读取解析)的时候知道是哪个成员了。
  • struct write 的过程其实是个递归的过程,也就是在write函数中, 会递归的调用结构体本身每个成员的write函数。
  • TCompactProtocol 和 TBinaryProtocol 的区别主要是, TCompactProtocol 对整数类型使用了 ZigZag 压缩算法,比如 i32 类型的整数本来是4个字节, 可以压缩成 1~5 字节不等。而 i64类型的整数本来是8个字节。可以压缩成 1~10 字节不等。

http://yanyiwu.com/work/2015/04/05/thrift-protocol-insight.html

Thrift之Protocol源码分析相关推荐

  1. Thrift异步IO服务器源码分析

    http://yanyiwu.com/work/2014/12/06/thrift-tnonblockingserver-analysis.html 最近在使用 libevent 开发项目,想起之前写 ...

  2. 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序

    [Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...

  3. Hadoop2源码分析-RPC机制初识

    1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础.RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等.若对 ...

  4. hadoop-common2.7源码分析之ProtobufRpcEngine(RPC实现)

    概述 ProtobufRpcEngine是在RPC通信过程中,使用ptotobuf作为数据交换格式的RPC实现类. 对ProtobufRpcEngine的源码分析将围绕RPC概念模型展开. RPC概念 ...

  5. Dubbo源码分析:小白入门篇

    关注公众号"java后端技术全栈" 回复"000"获取优质面试资料 大家好,我是老田 答应了小伙伴的Dubbo源码分析系列,今天终于来了,希望不是很晚. 主要也 ...

  6. storm启动nimbus源码分析-nimbus.clj

    storm启动nimbus源码分析-nimbus.clj nimbus是storm集群的"控制器",是storm集群的重要组成部分.我们可以通用执行bin/storm nimbus ...

  7. Nimbus二storm启动nimbus源码分析-nimbus.clj

    nimbus是storm集群的"控制器",是storm集群的重要组成部分.我们可以通用执行bin/storm nimbus >/dev/null 2>&1 &a ...

  8. kazoo源码分析:服务器交互的实现细节

    kazoo源码分析 kazoo-2.6.1 kazoo客户端与服务器概述 上文start概述中,只是简单的概述了kazoo客户端初始化之后,调用了start方法,本文继续详细的了解相关的细节. kaz ...

  9. kazoo源码分析:Zookeeper客户端start概述

    kazoo源码分析 kazoo-2.6.1 kazoo客户端 kazoo是一个由Python编写的zookeeper客户端,实现了zookeeper协议,从而提供了Python与zookeeper服务 ...

最新文章

  1. CVPR2017-最新目标检测相关
  2. Yann LeCun 最新发声:自监督+世界模型,让 AI 像人类与一样学习与推理
  3. 758.6G每秒:阿里云成功防御国内最大规模Memcached DDoS反射攻击
  4. aes子密钥生成c语言_一种基于流密码算法的子密钥生成方法与流程
  5. Hessian 源码简单分析
  6. 95-190-540-源码-window-清除器(Evictors)-简介
  7. iview“官方“实现的右键菜单
  8. 一些图像处理函数用法
  9. Windows10 中在指定目录下启动Powershell
  10. VS code 尝试在目标目录创建文件时发生一个错误
  11. (转载)一片文章带你理解再生核希尔伯特空间(RKHS)以及各种空间
  12. C++/MFC 串口通讯——光源控制器控制
  13. jsonp跨域请求用法
  14. java色号_RGB颜色与16进制颜色的换算方法
  15. oppo计算机找不到,oppo手机和电脑连接不上怎么办只显示充电(原来这个功能没有打开)...
  16. LIBCURL.LIB
  17. c++逆天改命进阶--map_set
  18. IP地址、子网掩码、网络号、主机号、网络地址、主机地址
  19. 空间几何(点线面)知识整理
  20. 警告: 检测到依赖关系环:_软件设计:依赖关系

热门文章

  1. html圆角兼容jq,IE兼容css3圆角的htc解决方法
  2. Spring Boot系列四 Spring @Value 属性注入使用总结一
  3. nav 计算机网络_CTO下载-计算机网络课件(配套韩立刚老师课程).ppt
  4. Android8.0适配方案
  5. C语言程序模拟银行输入密码,模拟银行输入密码--源码
  6. 赛门铁克卸载工具_神奇的安卓恶意软件 xHelper:自卸载且无法删除
  7. mysql 多表查询练习题_mysql多表查询练习
  8. codeigniter 禁止ip登录_「开源资讯」baigo SSO v4.0 beta-3 发布,单点登录系统
  9. mysql创建非聚集索引_一文看懂聚集索引和非聚集索引的区别
  10. 12.MapReduce第2部分(WordCount词频统计、自然连接)