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和其余方式的运行资源占用比较: