`
lobin
  • 浏览: 425257 次
  • 性别: 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序列化章节。

 

分享到:
评论

相关推荐

    thrift实现http协议案例

    Thrift是一种高效的、跨语言的服务框架,最初由Facebook开发,现在是Apache的顶级项目。它提供了强大的代码生成工具,可以从接口定义文件(IDL)生成多种编程语言的客户端和服务端代码,使得不同语言之间可以轻松地...

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

    总之,结合Wireshark和Thrift dissector,我们可以深入洞察Thrift协议的网络交互,这对于开发、调试和维护Thrift服务具有极大的价值。请确保正确配置和使用这些工具,以便充分利用它们的功能,提升你的工作效率。

    thrift-0.13.0.zip

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年创建,现在是Apache软件基金会的项目。它的主要目标是通过定义一种中间语言(IDL,Interface Definition Language)来简化不同编程语言之间的通信,使得...

    qt 实现thrift的一个例子

    在IT行业中,Thrift是一种高性能、可扩展的跨语言服务开发框架,由Facebook开源,用于构建分布式服务。它通过定义一种中间表示(IDL,接口定义语言)来描述服务,然后自动生成不同编程语言的代码,使得不同语言之间...

    C++(Qt)下的thrift的使用示例

    而Thrift则是一种开源的软件框架,用于构建可伸缩的服务,它支持多种编程语言,包括C++,并且允许不同语言之间进行高效的数据交换。在这个“C++(Qt)下的thrift的使用示例”中,我们将探讨如何在Qt项目中集成和使用...

    thrift-0.10.0.exe

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

    Windows下QT使用Thrift的样例

    在Windows环境下,使用QT结合Thrift进行开发是一项常见的任务,特别是在构建跨平台的服务或应用时。这个样例项目提供了一种方法,使开发者能够在QT环境中有效地利用Thrift框架。让我们详细了解一下这些技术以及如何...

    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_sasl-0.3.0.tar.gz

    Thrift SASL 0.3.0 是一个用于在分布式系统中实现安全传输层协议的开源库。Thrift 是一个跨语言的服务开发框架,而SASL(Simple Authentication and Security Layer)则是它的一个扩展,提供了身份验证和数据保护...

    netty+thrift高并发高性能

    ### Netty+Thrift 实现高并发高性能的关键技术解析 #### 一、引言 在当前互联网技术高速发展的背景下,高性能、高并发的服务框架成为众多企业和开发者追求的目标。Netty作为一款高性能、异步事件驱动的网络应用...

    thrift环境配置方法

    Thrift 环境配置方法 Thrift 是一个跨语言的 RPC 框架,由 Facebook 开发,用于建立高性能的服务之间的远程过程调用。为了使用 Thrift,需要配置好相关的环境,这篇文章将介绍 Thrift 环境配置的方法。 Thrift ...

    thrift在windows下生成C#代码

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年创建,并后来贡献给了Apache基金会。它主要用于构建可扩展且高效的分布式系统。Thrift通过定义一种中间表示(IDL,Interface Description Language)来...

    基于thrift的RPC调用实例

    在本实例中,我们将关注一个基于Thrift的RPC调用实现,Thrift是由Facebook开发的一种高效的跨语言服务开发框架。 Thrift的核心思想是定义一种中间描述文件(.thrift),该文件包含了服务接口、数据结构以及服务间的...

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

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年创建,并于2008年贡献给了Apache基金会。它通过定义一种中间语言(IDL,Interface Definition Language)来描述服务接口,允许开发者在不同的编程语言之间...

    Thrift-java学习小结

    Thrift是Facebook开源的一款高性能、跨语言的服务框架,它的设计目标是高效地在不同编程语言之间进行通信。本文将基于Thrift的Java实现,总结学习过程中的一些关键知识点,旨在帮助理解Thrift的工作原理以及如何在...

    Apache Thrift 使用说明

    Apache Thrift 是一款由 Facebook 开发的开源框架,主要用于构建跨语言的服务。Thrift 提供了一个集成的代码生成工具,允许开发者定义数据类型和服务接口,然后自动生成多种编程语言(如 C++ 和 Java)的客户端和...

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

    Thrift RPC客户端的服务化框架代码主要涉及了两个关键概念:Thrift和RPC(Remote Procedure Call,远程过程调用)。Thrift是由Facebook开发的一种开源跨语言服务框架,它允许定义数据类型和服务接口,然后自动生成...

    java代码使用thrift2操作hbase示例

    在本文中,我们将深入探讨如何使用Java通过Thrift2接口操作HBase数据库。HBase是一个分布式、可扩展的大数据存储系统,它构建于Hadoop之上,支持实时读写。Thrift是一个轻量级的框架,用于跨语言服务开发,允许不同...

    thrift2 查询hbase

    而Thrift是一种跨语言的服务框架,它提供了一种轻量级的通信机制,允许不同编程语言之间进行高效的数据交互。在本示例中,我们将深入探讨如何使用Python通过Thrift2接口来查询HBase。 首先,我们需要理解Thrift2与...

Global site tag (gtag.js) - Google Analytics