bool
:布尔类型(
true
or value),占一个字节
php
byte:有符号字节
java
i16:16位有符号整型
c++
i32:32位有符号整型
服务器
i64:64位有符号整型
网络
double
:64位浮点数
多线程
string:未知编码或者二进制的字符串
框架
注意,thrift不支持无符号整型,由于不少目标语言不存在无符号整型(如java)。post
* TBinaryProtocol : 二进制编码格式进行数据传输。
* TCompactProtocol : 这种协议很是有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
* TJSONProtocol : 使用JSON的数据编码协议进行数据传输。
* TSimpleJSONProtocol : 这种节约只提供JSON只写的协议,适用于经过脚本语言解析
* TDebugProtocol : 在开发的过程当中帮助开发人员调试用的,以文本的形式展示方便阅读。学习
* TSocket : 使用堵塞式I/O进行传输,也是最多见的模式。
* TFramedTransport : 使用非阻塞方式,按块的大小,进行传输,相似于Java中的NIO。
* TFileTransport : 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,可是实现起来很是简单。
* TMemoryTransport : 使用内存I/O,就比如Java中的ByteArrayOutputStream实现。
* TZlibTransport : 使用执行zlib压缩,不提供Java的实现。ui
* TSimpleServer : 单线程服务器端使用标准的堵塞式I/O。
* TThreadPoolServer : 多线程服务器端使用标准的堵塞式I/O。
* TNonblockingServer : 多线程服务器端使用非堵塞式I/O,而且实现了Java中的NIO通道。
Transport : Transport层提供了一个简单的网络读写抽象层。这使得thrift底层的transport从系统其它部分(如:序列化/反序列化)解耦。
规范的struct定义中的每一个域均会使用required或者optional关键字进行标识。若是required标识的域没有赋值,Thrift将给予提示;若是optional标识的域没有赋值,该域将不会被序列化传输;若是某个optional标识域有缺省值而用户没有从新赋值,则该域的值一直为缺省值;若是某个optional标识域有缺省值或者用户已经从新赋值,而不设置它的__isset为true,也不会被序列化传输。
不一样于protocal buffer,thrift不支持枚举类嵌套,枚举常量必须是32位的正整数
enum EnOpType { CMD_OK = 0, // (0) CMD_NOT_EXIT = 2000, // (2000) CMD_EXIT = 2001, // (2001) CMD_ADD = 2002 // (2002) } struct StUser { 1: required i32 userId; 2: required string userName; 3: optional EnOpType cmd_code = EnOpType.CMD_OK; // (0) 4: optional string language = “english” }
便于管理、重用和提升模块性/组织性,经常分割Thrift定义在不一样的文件中。包含文件搜索方式与c++同样。Thrift容许文件包含其它thrift文件,用户须要使用thrift文件名做为前缀访问被包含的对象
include "test.thrift" ... struct StSearchResult { 1: in32 uid; ... }
Thrift中的命名空间相似于C++中的namespace和java中的package,它们提供了一种组织(隔离)代码的简便方式。名字空间也能够用于解决类型定义中的名字冲突。
namespace cpp com.example.test namespace java com.example.test namespace php com.example.test
服务的定义方法在语义(semantically)上等同于面向对象语言中的接口。Thrift编译器会产生执行这些接口的client和server stub。具体参见下一节。在流行的序列化/反序列化框架(如protocal buffer)中,Thrift是少有的提供多语言间RPC服务的框架。这是Thrift的一大特点。
service SeTest { void ping(), bool postTweet(1: StUser user); StUser searchTweets(1:string name); oneway void zip() }
Thrift结构体将会被转换成面向对象语言的类。异常在语法和功能上相似于结构体,差异是异常使用关键字exception,并且异常是继承每种语言的基础异常类。
exception Extest { 1: i32 errorCode, 2: string message, 3: StUser userinfo }
struct是定义为一种对象,和面向对象语言的class差很少.,可是struct有如下一些约束:
struct Report { 1: required string msg, //改字段必须填写 2: optional i32 type = 0; //默认值 3: i32 time //默认字段类型为optional }