Apache Thrift 是Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,Javascript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。
架构图一、基本类型
①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和其他方式的所产生的内容大小比较结果如下:
使用Thrift和其他方式的运行资源占用比较: