一 简介:
Apache Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器,现在是 Apache 基金会的顶级项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性,所以thrift可以支持多种程序语言:C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml, Delphi等。
Apache Thrift是跨语言服务访问的RPC通信框架。通过接口定义语言(IDL)定义和创建服务,Thrift生成特定语言的可供server和client访问的代码。关于IDL的话题我们可以追溯到CORBA盛行1999-2001年(Common Object Request Broker Architecture/公用对象请求代理体系结构)。Apache Thrfit有着非常优秀的效率。适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相对于JSON和xml无论在性能、传输大小上有明显的优势。
二 需要的工具和文件:
以java为例,使用thirft时,在编写完接口定义文件*.thirft后,需要一个生成器(windows下是thrift-0.9.3.exe)来生成server和client的代码,生成的代码里面依赖一个jar包libthrift-0.9.3.jar。
thrift-0.9.3.exe官网有提供直接下载,libthrift-0.9.3.jar官网有提供maven的下载方式:
http://thrift.apache.org/download
也可以通过下载thrift源码工程来编译生成thrift-0.9.3.exe和libthrift-0.9.3.jar,下载下来的是一个压缩包thrift-0.9.3.tar.gz,解压后路径thrift-0.9.3\compiler下就是thrift-0.9.3.exe的源码,cpp写的,有兴趣可以编译打包一下。路径thrift-0.9.3\lib\java下就是libthrift-0.9.3.jar的源码,直接导入eclipse,直接ant build一下就可以了,在build目录下就能找到打包好的libthrift-0.9.3.jar以及一些依赖的jar包。
三 接口定义文件说明
thrift-0.9.3.tar.gz,解压后文件thrift-0.9.3\tutorial\tutorial.thrift是一份关于接口定义文件的基本说明:
1--支持的类型
bool Boolean, one byte
byte Signed byte
i16 Signed 16-bit integer
i32 Signed 32-bit integer
i64 Signed 64-bit integer
double 64-bit floating point value
string String
binary Blob (byte array)
map<t1,t2> Map from one type to another
list<t1> Ordered list of one type
set<t1> Set of unique elements of one type
2--可以include另外一个*.thrift,默认是搜索当前路径的,也可以在编译*.thrift文件时,命令行用-I指定要搜索的被包含文件的路径
include "shared.thrift"
3--针对不同的语言命名空间、包或前缀
namespace cpp tutorial
namespace d tutorial
namespace java tutorial
namespace php tutorial
namespace perl tutorial
namespace haxe tutorial
4--像c语言一样重新命名类型
typedef i32 MyInteger
5--可以定义常量,复杂类型的常量使用json来赋值
const i32 INT32CONSTANT = 9853
const map<string,string> MAPCONSTANT = {'hello':'world', 'goodnight':'moon'}
6--可以定义枚举,值是32位的整数,不指定值的话默认从1开始算起
enum Operation {
ADD = 1,
SUBTRACT = 2,
MULTIPLY = 3,
DIVIDE = 4
}
7--可以定义一个struct,每一个field由整数标识符,一个类型,一个符号名称,和一个可选的默认值,field可声明为可选(如果没set值的话,序列化输出的时候将会忽略)
struct Work {
1: i32 num1 = 0,
2: i32 num2,
3: Operation op,
4: optional string comment,
}
8--定义异常类型的struct
exception InvalidOperation {
1: i32 whatOp,
2: string why
}
9--定义一个服务,可以使用关键字extends继承另外一个服务
service Calculator extends shared.SharedService { //SharedService定义在另外一个文件shared.thrift
//类似c语言风格定义一个方法,可以有参数和异常列表
void ping(),
i32 add(1:i32 num1, 2:i32 num2),
i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
//用oneway声明的方法只接受请求,没有响应,返回类型必须是void
oneway void zip()
}
以上仅是一些比较基础的说明,更多详细的例子在路径thrift-0.9.3\test下