介绍

Apache Thrift 是Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,Javascript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。

架构图

143430669.jpg



数据类型

一、基本类型

bool:布尔值,true 或 false,对应 Java 的 Boolean

byte:8 位有符号整数,对应 Java 的 byte

i16:16 位有符号整数,对应 Java 的 short

i32:32 位有符号整数,对应 Java 的 int

i64:64 位有符号整数,对应 Java 的 long

double:64 位浮点数,对应 Java 的 double

string:未知编码文本或二进制字符串,对应 Java 的 String

※在使用PHP时要注意i64类型

二、结构体类型

struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean

※不支持继承

三、容器类型

list:列表。对应 Java 的 ArrayList

set:集合。对应 Java 的 HashSet

map:对应 Java 的 HashMap

四、异常类型

exception:对应 Java 的 Exception

五、服务类型

service:对应服务的类

※支持继承

六、常量

const 类型 变量名=值

※在java中会把定义的常量都生成到一个public类型的Constant类中

七、类型定义

typedef i32 MyInteger

※C/C++风格,java不支持

八、枚举类型

enum EnumType

※不支持类型嵌套,枚举常量必须是32位的正整数;

九、其他

注释

支持#,/**/,//类型的注释风格。建议使用/**/和//类型注释。

命名空间

namespacejava com.kongfz.pm

说明:a、namespace为关键字

b、java为语言定义

c、com.kongfz.pm为空间名称,相当于java的package

文件包含

include"othre.thrift"

十、


协议

Thrift 可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。常用协议有以下几种:

TBinaryProtocol——进制编码格式协议

TCompactProtocol——压缩的二进制编码格式协议

TJSONProtocol ——JSON格式的编码格式协议

TSimpleJSONProtocol——只提供JSON 只写的协议(适用于通过脚本语言解析)

TDebugProtocol——供开发调试使用


传输层

常用的传输层有一下几种:

TSocket——使用阻塞式I/O进行传输。也是最常用模式;

TFrameTransport——非阻塞方式。以帧为单位传输;

TNonblockingTransport——使用非阻塞方式,用于构建异步客户端

TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。

TFileTransport——按照文件的方式传输,不支持java;

TZlibTransport- 使用执行zlib压缩,不提供Java的实现

※②和③的区别:②的非阻塞方式是服务端非阻塞,客户端是阻塞的;③是异步方式调用,客户端需要使用回调函数来处理返回结果。

※应用最广泛的是①、②和③


服务端类型

常见的服务端类型有:

TSimpleServer——单线程服务端使用标准的阻塞式I/O;


TThreadPoolServer——多线程服务端使用标准的阻塞式I/O;

※需要根据服务器的具体情况设置最大和最小线程数,以保证服务器最佳性能

TNonblockingServer——多线程服务端使用的非阻塞式I/O


命令

thrift-r --gen java xxx.thrift

其中:

thrift:是thrift的执行命令;

r:生成包含文件;

java:要生成代码的语言;

gen:表示动态生成代码的标志;

xxx.thrift:thrift的定义文件

关键字

常用的关键字有:

required:在struct中定义时使用,表示该字段必须有值——系统检查;

optional:在struct中定义时使用,表示该字段是可选的,有值也行无值也可;无值时不会被序列化、也不会被传输;

oneway:在service中修饰方法时使用,表示client发出请求后不必等待回复,直接进行后面的操作。另外,该方法的返回值必须是void类型;

const:除了定义常量以外,可以修饰方法的参数,表示参数时只读的,不能修改和返回。


比较

Thrift与其他传输方式的比较:

1、xml与JSON相比体积太大,但是xml传统,也不算复杂;

2、json 体积较小,新颖,但不够完善;

3、thrift 体积超小,使用起来比较麻烦,不如前两者轻便,但是对于高并发、数据传输量大、多语言环境, 满足其中2点使用 thrift还是值得的。

假定需要传输相同的内容,但使用不同的方式从 a、传输内容所产生的大小b、传输过程中服务端和客户端所产生的开销,这2个方便进行比较。

使用Thrift和其他方式的所产生的内容大小比较结果如下:

143458632.png

使用Thrift和其他方式的运行资源占用比较:

143515656.png