Thrift协议

Posted qingshuiqingqing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thrift协议相关的知识,希望对你有一定的参考价值。

Thrift自下到上可以分为4

Server(single-threaded, event-driven etc)

服务器进程调度

Processor(compiler generated)

RPC接口处理函数分发,IDL定义接口的实现将挂接到这里面

Protocol (JSON, compact etc)

协议

Transport(raw TCP, HTTP etc)

网络传输

Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。

Thrift支持的传输及服务模型

支持的传输格式:

参数 描述

TBinaryProtocol 二进制格式

TCompactProtocol 压缩格式

TJSONProtocol JSON格式

TSimpleJSONProtocol 提供JSON只写协议, 生成的文件很容易通过脚本语言解析。

TDebugProtocol 使用易懂的可读的文本格式,以便于debug

支持的数据传输方式:

参数 描述

TSocket 阻塞式socker

TFramedTransport 以frame为单位进行传输,非阻塞式服务中使用。

TFileTransport 以文件形式进行传输。

TMemoryTransport 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。

TZlibTransport 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。

支持的服务模型:

参数 描述

TSimpleServer 简单的单线程服务模型,常用于测试

TThreadPoolServer 多线程服务模型,使用标准的阻塞式IO。

TNonblockingServer 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

 

基本类型

  • bool: 布尔值 (true or false), one byte
  • byte:  有符号字节
  • i16:  16位有符号整型
  • i32:  32位有符号整型
  • i64:  64位有符号整型
  • double: 64位浮点型
  • string: Encoding agnostic text or binary string
  • struct结构体  thrift中struct是定义为一种对象,和面向对象语言的class差不多.,但是struct有以下一些约束: 

struct不能继承,但是可以嵌套,不能嵌套自己。 

1. 其成员都是有明确类型 

2. 成员是被正整数编号过的,其中的编号使不能重复的,这个是为了在传输过程中编码使用。 

3. 成员分割符可以是逗号(,)或是分号(;),而且可以混用,但是为了清晰期间,建议在定义中只使用一种,比如C++学习者可以就使用分号(;)。 

4. 字段会有optional和required之分和protobuf一样,但是如果不指定则为无类型–可以不填充该值,但是在序列化传输的时候也会序列化进去, 
   optional是不填充则部序列化,required是必须填充也必须序列化

5. 每个字段可以设置默认值 
6. 同一文件可以定义多个struct,也可以定义在不同的文件,进行include引入。 

 Expand source
 
  • 容器(Containers

Thrift3种可用容器类型:

    1. list(t): 元素类型为t的有序表,容许元素重复。
    2. set(t):元素类型为t的无序表,不容许元素重复。对应c++中的set,java中的HashSet,python中的set,php中没有set,则转换为list类型。
    3. map(t,t): 键类型为t,值类型为t的kv对,键不容许重复。对用c++中的map, Java的HashMap, PHP 对应 array, Python/Ruby 的dictionary。
 
 容器中元素类型可以是除了service外的任何合法Thrift类型(包括结构体和异常)。为了最大的兼容性,map的key最好是thrift的基本类型,有些语言不支持复杂类型的key,JSON协议只支持那些基本类型的key。 容器都是同构容器,不失异构容器。 

以上是关于Thrift协议的主要内容,如果未能解决你的问题,请参考以下文章

Windows 上的 Thrift / Google 协议缓冲区

Thrift的TJsonProtocol协议分析

thrift说明

HBase Thrift协议编程入门教程

thrift序列化协议

RPC远程协议之Thrift非阻塞多线程处理