thrift入门介绍



介绍

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

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

架构图



数据类型

1、基本类型编程

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

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类型

2、结构体类型

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

※不支持继承

3、容器类型

list:列表。对应 Java 的 ArrayList

set:集合。对应 Java 的 HashSet

map:对应 Java 的 HashMap

4、异常类型

exception:对应 Java 的 Exception

5、服务类型

service:对应服务的类

※支持继承

6、常量

const 类型 变量名=值

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

7、类型定义

typedef i32 MyInteger

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

8、枚举类型

enum EnumType

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

9、其余

注释

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

命名空间

namespacejava com.kongfz.pm

说明:a、namespace为关键字

b、java为语言定义

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

文件包含

include"othre.thrift"

10、


协议

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与其余传输方式的比较:

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

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

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

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

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

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

相关文章
相关标签/搜索