目录
1 简介
1.1 概览
Apache Thrift官网
Thrift是一个跨语言的服务开发部署 框架,其最初由Facebook于2007年开发,于2008年加入Apache开源项目。
Thrift 通过编译thrift文件(由Thrift Types 组织的中间语言,用于定义RPC数据结构),生成不同语言的类。这些类负责RPC协议层和传输层的实现。
1.2 优点
相对于XML、Json,Thrift在性能和传输数据压缩上有绝对优势。
2 简单使用
2.1 过程
- 下载并编译 thrift编译器 .
- 编写thrift文件.需要用到 thrift自定义数据类型 .包括
- 基本数据类型
- 特殊数据类型(binary)
- 结构体
- 容器(list,set,map).容器元素可以是服务以外的任何thrift type .
- 异常(Exceptions)
- 服务
- 编译thrift文件,生成可供服务端和客户调用的源码.命令语法如下:
1 |
thrift --gen <language> <thrift filename> |
2.2 简单实例
2.2.1 编辑thrift文件
代码清单如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
namespace cpp im struct Msg { 1:i32 idFrom, 2:i32 idTo, 3:string content, } service transMsg { void trans(1:Msg m); } |
2.2.2 生成cpp代码
使用thrift.exe :
1 |
thrift.exe -gen cpp transMsg.thrift |
此时会在 "gen-cpp" 文件夹(默认文件夹)下生成相应的cpp代码:
1 2 3 4 5 6 7 |
msg_constants.cpp msg_constants.h msg_types.cpp msg_types.h transMsg.cpp transMsg.h transMsg_server.skeleton.cpp |
其中 "msg_ types" 和 "msg_ constants" 对数据类型进行了定义,"transMsg" 实现了基本逻辑。"transMsg_ server.skeleton" 则简单实现了一个server端的实例。
2.2.3 实现业务逻辑
新建两个工程,一个做为服务端,一个做为用户端。 将 gen-cpp 文件夹下的文件分别添加到两个工程中,并在工程中添加thrift的静态库(或直接引用源码).
Server端的工程可以直接使用生成的代码。Client端的业务则需要自己实现。
下面简单实现Client端的业务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
int main(int argc, char **argv) { int port = 9090; std::string strHost("192.168.3.11"); boost::shared_ptr<TTransport> socket(new TSocket(strHost.c_str(), port)); boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket)); boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); transMsgClient client(protocol); try { im::Msg m; m.__set_idFrom(10); m.__set_idTo(280); m.__set_content("Hi, I`m a message. "); transport->open(); client.trans(m); transport->close(); } catch (TException e) { printf("%s", e.what()); } system("pause"); return 0; } |
其中strHost为服务器的IP.
继续阅读