Thrift(
http://github.com/facebook/thrift
)是一个跨语言服务部署架构,2007年由Facebook开发,之后在2008年加到Apache计划中(
http://incubator.apache.org/thrift/
)。它是类似于SOAP,CORBA以及Google Protocol Buffers这样的服务架构。Thrift提供了完整client/server RPC的实现,只需要定义好中间定义语言,就可以生成指定语言的代码(包括client和server)。
Thrift能生成的语言有: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml
使用thrift,以下例子你可以在
http://incubator.apache.org/thrift/
中找到。
定义.thrift接口文件。
你需要知道thrift所支持的类型(
http://wiki.apache.org/thrift/ThriftTypes
)
下面是一个简述:
类型 |
描述 |
bool |
true, false |
byte |
8位的有符号整数 |
i16 |
16位的有符号整数 |
i32 |
32位的有符号整数 |
i64 |
64位的有符号整数 |
double |
64位的浮点数 |
string |
UTF-8编码的字符串 |
binary |
字符数组 |
struct |
结构体 |
list |
有序的元素列表,类似于STL的vector |
set |
无序的不重复元素集,类似于STL的set |
map |
key-value型的映射,类似于STL的map |
exception |
是一个继承于本地语言的exception基类 |
service |
服务。包含多个函数接口(纯虚函数) |
在了解过thrift内置类型之后,我们可以简单地定义一个服务,把用户的信息从前端发送到服务器,然后当需要的时候再从服务器获取某个用户的信息:
struct UserProfile {
1
: i32 uid,
2
: string name,
}
service UserStorage {
void store(
1
: UserProfile user),
UserProfile retrieve(
1
: i32 uid)
}
把以上代码存到 service.thrift文件中。
如果我们需要用python来做输出语言。就在命令行中输入:
thrift –r –gen py service.thrift
之后,你就会在当前目录下看到一个新建的目录叫”gen-py”,在里面你就可以看到由service.thrift生成的python服务接口代码。
UserStorage.py中的Client就是客户端调用的接口,只需要创建一个Client实例就可以调用例子中的store和retrieve的接口。而Iface就是服务端所需要实现的接口,对应例子中的store和retrieve的逻辑处理。
ttypes.py是存放枚举类型的结构。
UserStorage-remote.py是一个客户端调用服务接口的demo示例,想知道详细的可以去看看。