Thrift之Protocol源码分析
之前写过两篇关于 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源码分析相关推荐
- Thrift异步IO服务器源码分析
http://yanyiwu.com/work/2014/12/06/thrift-tnonblockingserver-analysis.html 最近在使用 libevent 开发项目,想起之前写 ...
- 【Android SDM660源码分析】- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序
[Android SDM660源码分析]- 01 - 如何创建 UEFI XBL Protocol DXE_DRIVER 驱动及UEFI_APPLICATION 应用程序 一.创建DXE_DRIVER ...
- Hadoop2源码分析-RPC机制初识
1.概述 上一篇博客,讲述Hadoop V2的序列化机制,这为我们学习Hadoop V2的RPC机制奠定了基础.RPC的内容涵盖的信息有点多,包含Hadoop的序列化机制,RPC,代理,NIO等.若对 ...
- hadoop-common2.7源码分析之ProtobufRpcEngine(RPC实现)
概述 ProtobufRpcEngine是在RPC通信过程中,使用ptotobuf作为数据交换格式的RPC实现类. 对ProtobufRpcEngine的源码分析将围绕RPC概念模型展开. RPC概念 ...
- Dubbo源码分析:小白入门篇
关注公众号"java后端技术全栈" 回复"000"获取优质面试资料 大家好,我是老田 答应了小伙伴的Dubbo源码分析系列,今天终于来了,希望不是很晚. 主要也 ...
- storm启动nimbus源码分析-nimbus.clj
storm启动nimbus源码分析-nimbus.clj nimbus是storm集群的"控制器",是storm集群的重要组成部分.我们可以通用执行bin/storm nimbus ...
- Nimbus二storm启动nimbus源码分析-nimbus.clj
nimbus是storm集群的"控制器",是storm集群的重要组成部分.我们可以通用执行bin/storm nimbus >/dev/null 2>&1 &a ...
- kazoo源码分析:服务器交互的实现细节
kazoo源码分析 kazoo-2.6.1 kazoo客户端与服务器概述 上文start概述中,只是简单的概述了kazoo客户端初始化之后,调用了start方法,本文继续详细的了解相关的细节. kaz ...
- kazoo源码分析:Zookeeper客户端start概述
kazoo源码分析 kazoo-2.6.1 kazoo客户端 kazoo是一个由Python编写的zookeeper客户端,实现了zookeeper协议,从而提供了Python与zookeeper服务 ...
最新文章
- CVPR2017-最新目标检测相关
- Yann LeCun 最新发声:自监督+世界模型,让 AI 像人类与一样学习与推理
- 758.6G每秒:阿里云成功防御国内最大规模Memcached DDoS反射攻击
- aes子密钥生成c语言_一种基于流密码算法的子密钥生成方法与流程
- Hessian 源码简单分析
- 95-190-540-源码-window-清除器(Evictors)-简介
- iview“官方“实现的右键菜单
- 一些图像处理函数用法
- Windows10 中在指定目录下启动Powershell
- VS code 尝试在目标目录创建文件时发生一个错误
- (转载)一片文章带你理解再生核希尔伯特空间(RKHS)以及各种空间
- C++/MFC 串口通讯——光源控制器控制
- jsonp跨域请求用法
- java色号_RGB颜色与16进制颜色的换算方法
- oppo计算机找不到,oppo手机和电脑连接不上怎么办只显示充电(原来这个功能没有打开)...
- LIBCURL.LIB
- c++逆天改命进阶--map_set
- IP地址、子网掩码、网络号、主机号、网络地址、主机地址
- 空间几何(点线面)知识整理
- 警告: 检测到依赖关系环:_软件设计:依赖关系
热门文章
- html圆角兼容jq,IE兼容css3圆角的htc解决方法
- Spring Boot系列四 Spring @Value 属性注入使用总结一
- nav 计算机网络_CTO下载-计算机网络课件(配套韩立刚老师课程).ppt
- Android8.0适配方案
- C语言程序模拟银行输入密码,模拟银行输入密码--源码
- 赛门铁克卸载工具_神奇的安卓恶意软件 xHelper:自卸载且无法删除
- mysql 多表查询练习题_mysql多表查询练习
- codeigniter 禁止ip登录_「开源资讯」baigo SSO v4.0 beta-3 发布,单点登录系统
- mysql创建非聚集索引_一文看懂聚集索引和非聚集索引的区别
- 12.MapReduce第2部分(WordCount词频统计、自然连接)