`
lobin
  • 浏览: 379336 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Thrift

 
阅读更多

<版本号,2字节><无用字段,1字节><消息类型,1字节><方法名长度,4字节><方法名,n字节><序列号,4字节><参数…,n字节>

 

<参数…,n字节>参考struct

 

Field

<Field类型,1字节><Field Id,2字节>

<Field类型(stop),1字节>

 

 

 

 

上面的Field Id对应下面例子中”:”前面的数字:

 

struct Order {

    1: required i64 orderId;

    2: required i64 userId;

    3: required string status;

}

 

 

 

 

Field

stop

<Field类型(stop),1字节> -> <0x00(0),1字节>

 

void

bool

<Field类型(bool),1字节><Field Id,2字节><值,bool(1字节)> -> <0x02(2),1字节><Field Id,2字节><值,bool(1字节)>

 

byte

<Field类型(byte),1字节><Field Id,2字节><值,byte(1字节)> -> <0x03(3),1字节><Field Id,2字节><值,byte(1字节)>

 

double

<Field类型(double),1字节><Field Id,2字节><值,double(8字节)> -> <0x04 (4),1字节><Field Id,2字节><值,double(8字节)>

 

 

 

 

 

 

 

 

 

i16

<Field类型(i16),1字节><Field Id,2字节><值,i16(2字节)> -> <0x06(6),1字节><Field Id,2字节><值,i16(2字节)>

 

i32

<Field类型(i32),1字节><Field Id,2字节><值,i32(4字节)> -> <0x08(8),1字节><Field Id,2字节><值,i32(4字节)>

 

i64

<Field类型(i64),1字节><Field Id,2字节><值,i64(8字节)> -> <0x0A(10),1字节><Field Id,2字节><值,i64(8字节)>

 

 

 

 

 

 

 

 

 

string

 

<Field类型(string),1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> -> <0x0B(11),1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节>

 

 

 

 

 

 

 

 

 

struct

<Field类型(struct),1字节><Field Id,2字节>…<Field类型(stop),1字节> -> <0x0C(12),1字节><Field Id,2字节>… <0x00(0),1字节>

 

 

<Field类型(struct),1字节><Field Id,2字节>

    <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

    <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

    <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

    <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

    <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> | 

    (<Field类型(struct),1字节><Field Id,2字节>

        <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

        <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

        <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

        <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

        <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

        …

    <Field类型(stop),1字节>)

    …

<Field类型(stop),1字节>

 

 

 

几种特殊情况下的struct

方法参数(args)

方法调用时需要传递的参数通过struct进行序列化。在scheme中实现。

 

 

 

<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

<Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

<Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

<Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

<Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

<Field类型,1字节><Field Id,2字节><值,double(8字节)>|

<Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> | 

(<Field类型(struct),1字节><Field Id,2字节>

    <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

    <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

    <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

    <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

    <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

    …

<Field类型(stop),1字节>)|

<Field类型(stop),1字节>

 

 

 

 

 

 

方法返回

方法调用后返回值通过struct进行序列化。在scheme中实现。

 

 

 

 

map

<Field类型(map),1字节><Field Id,2字节>< map中key类型,1字节>< map中value类型,1字节>< set中元素个数,4字节>

    ((<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

    <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

    <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

    <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

    <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> | 

    (<Field类型(struct),1字节><Field Id,2字节>

        <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

        <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

        <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

        <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

        <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

        …

    <Field类型(stop),1字节>))

    (<Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

    <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

    <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

    <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

    <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> | 

    (<Field类型(struct),1字节><Field Id,2字节>

        <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

        <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

        <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

        <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

        <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

        …

    <Field类型(stop),1字节>)))

    …

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

set

<Field类型(set),1字节><Field Id,2字节>< set中元素类型,1字节>< set中元素个数,4字节>

    <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

    <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

    <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

    <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

    <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> | 

    (<Field类型(struct),1字节><Field Id,2字节>

        <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

        <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

        <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

        <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

        <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

        …

    <Field类型(stop),1字节>)

    …

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

list

<Field类型(list),1字节><Field Id,2字节><list中元素类型,1字节><list中元素个数,4字节>

    <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

    <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

    <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

    <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

    <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

    <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> | 

    (<Field类型(struct),1字节><Field Id,2字节>

        <Field类型,1字节><Field Id,2字节><值,bool(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,byte(1字节)>|

        <Field类型,1字节><Field Id,2字节><值,i16(2字节)>|

        <Field类型,1字节><Field Id,2字节><值,i32(4字节)>|

        <Field类型,1字节><Field Id,2字节><值,i64(8字节)>|

        <Field类型,1字节><Field Id,2字节><值,double(8字节)>|

        <Field类型,1字节><Field Id,2字节><string类型字段长度,4字节><值,n字节> |

        …

    <Field类型(stop),1字节>)

    …

 

 

 

 

 

 

 

 

 

 

 

enum

 

 

 

 

 

 

 

 

 

版本号

版本字段由第1-2个字节决定,必须是0x80, 0x01。总共2个字节,转换为整型为0x8001???? ,与掩码0xffff0000进行与操作后得到版本号。

0x8001???? -> 0x80 0x01 0x?? 0x??

 

0x80010000 -> 0x80 0x01 0x00 0x00

 

消息类型

消息类型字段由第4个字段决定,包括call(1)、reply(2)、exception(3)以及one-way(4) 4种消息类型

 

方法名长度

方法名长度字段由第5-8个字段决定。

 

方法名

方法名字段由第9-?个字段决定。

 

序列号

4个字节。



Java序列化机制实现:参考https://lobin.iteye.com/blog/629414序列化章节。

 

分享到:
评论

相关推荐

    the programmer's guide to apache thrift

    Apache Thrift is an open source cross language serialization and RPC framework. With support for over 15 programming languages, Apache Thrift can play an important role in a range of distributed ...

    thrift-0.9.3.exe

    Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, ...

    用C#和C++写的Apache Thrift的小范例

    本例改编自Apache Thrift教程: http://mikecvet.wordpress.com/2010/05/13/apache-thrift-tutorial-the-sequel/ http://chanian.com/2010/05/13/thrift-tutorial-a-php-client/ 原教程使用的是c++ server和...

    Learning.Apache.Thrift.178588274

    Make applications cross-communicate using Apache Thrift! About This Book Leverage Apache Thrift to enable applications written in different programming languages (Java, C++, Python, PHP, Ruby, and so...

    Windows下QT使用Thrift的样例

    网上一直搜不到Windows下QT使用thrift的例子,自己整了个 QT版本 5.8.0 Boost版本 boost_1_61_0 Thrift版本 thrift-0.10.0

    使用wireshark抓取thrift协议接口调用

    使用wireshark抓取thrift协议接口调用

    thrift-0.9.2.tar.gz

    thrift,Apache Thrift 0.9.2 版本,解压后直接直接安装,可伸缩的跨语言服务开发框架,命令: 解压命令:tar -zxf thrift-0.9.2.tar.gz 安装命令:./configure --with-lua=no && make && make install 查看版本:...

    thrift-0.10.0.exe

    Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, ...

    Thrift之C++初体验

    thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, ...

    java代码使用thrift2操作hbase示例

    java代码使用thrift2操作hbase示例,thrift2连接hbase添加数据,单条查找,删除数据,根据扫描器查找,修改数据等测试实例

    thrift环境搭建(内附thrift运行环境可执行程序、搭建说明文本)

    thrift环境搭建(内附thrift运行环境可执行程序、搭建说明文本)

    Thrift RPC客户端的服务化框架代码

    Thrift RPC客户端的服务化框架代码,

    thrift 源码(一种可伸缩的跨语言服务的发展软件框架)

    thrift是一种可伸缩的跨语言服务的发展软件框架。它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C + +,C#,Java,Python和PHP和Ruby结合。thrift是facebook开发的,我们现在把它作为...

    thrift-0.10.0.tar.gz

    Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, ...

    thrift环境配置方法

    thrift 环境配置方法,步骤,顺序,只有文档,里面的方法很详细

    使用thrift、websocket在javascript和cpp之间建立rpc调用

    使用thrift、websocket在javascript和c++之间建立rpc调用机制。 如果要使用js+html来写界面,cpp来写底层业务逻辑,这就非常有用了。 当然,如果底层不用cpp来写,也可以参考本代码的js对thrift的rpc包装。

    thrift-编译工具

    thrift-编译工具

    zookeeper + thrift实现的RPC 服务治理框架演示

    这个示例工程和我的博客《架构设计:系统间通信(13)——RPC实例Apache Thrift 下篇》(http://blog.csdn.net/yinwenjie/article/details/49869535)相对应。相关的设计和代码说明,请参见我的博客。另外,工程已经...

    thrift文件生成工具thrift-generator.zip

    thrift-generator 是通过 Java 的接口生成 thrift 文件的工具。例子:public interface ICommonUserService {  public User login(int id, String name);  public User getUserById(long id);  ...

    基于thrift的RPC调用实例

    RPC(Remote Procedure Call Protocol)远程过程调用协议实例,学习和使用thrift无痛入门代码。具体使用方法,可以看博客详解。

Global site tag (gtag.js) - Google Analytics