Apache Thrift用于在其公司内部系统的各语言之间进行RPC通信,支持c++、java、Python、PHP、Ruby、Perl、c#、Cocoa、Node.js主流语言
对于高并发、大数据量和多语言开发有很大优势。
一、到点击打开链接下载Thrift的最新版,我是在linux下使用的,要下载.tar.gz的源代码包
二、本人使用的是c++接口,由于Thrift用到了boost库的内容,所以还要安装boost库
三、进入Thrift源代码目录,执行以下命令:
./configure
sudo make install
四、等待安装完成,完成之后;可以尝试执行Thrift,如果成功安装,将会启动Thrift程序,并输出帮助信息。
安装完成之后就可以进行Thrift开发了。
1、编写Thrift文件。Thrift的核心在于其IDL,因此使用Thrift的第一步就是使用IDL编写代码,描述系统中所需使用的数据类型以及服务,这些文件 的后缀名是.thrift
现在使用DIL描述一个简单的消息服务(Message)。创建一个文件,名为message.thrift,并使用编辑器打开,按照如下编辑
struct Message
{
1:string id,
2:string content,
}
service MessageService
{
Message latestMessage(),
}
这样我们就定义了一个名为MessageService的服务接口,包含一个方法latestMessage(),返回类型为Message,参数为空,用于获取最新消息。
完成类型定义后,我们需要使用Thrift来生成特定语言的源代码。执行以下命令
thrift -r --gen cpp message.thrift
执行完成当前目录会出现一个gen_cpp目录,里面就是自动生成的c++代码
2、编写服务端。进入gen_cpp目录,里面有一个文件名为MessageService_skeleton.cpp。该文件是对MessageService服务接口的实现模板。创建一个和gen_cpp同级的目录,名为src,并将该文件复制到src下,改名为server.cpp。打开该文件,内容如下所示。
//This autogenerated skeleton file illustrates how to build a server
//You should copy it to another filename to avoid overwriting it
#include "MessageService.h"
#include
#include
#include
#include
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using boost::shared_ptr;
//继承一个自己的服务,latestMessage为具体的服务
class MessageServiceHandler : virtual public MessageServiceIf
{
public:
MessageServiceHandler(){
//Your initialization goes here
}
void latestMessage(Message& _return)
{
//Your implementation goes here
printf("latestMessage\n");
}
};
int main(int argc,char **argv)
{
int port = 9090;
shared_ptr
handler(new MessageServiceHandler()); //将自己的服务包装在这里的processor。 shared_ptr
processor(new MessageServiceProcessor(handler)); shared_ptr
serverTransport(new TServerSocket(port)); shared_ptr
transportFactory(new TBufferedTransportFactory()); shared_ptr
protocolFactory(new TBinaryProtocolFactory()); //注册到server中 TSimpleServer server(processor,serTransport,transportFactory,protocolFactory); server.serve(); return 0; } void latestMessage(Message& _return) { Message message; message.id = "1234aef30c"; message.content = "this is the latest message"; _return = message; }
用如下命令编译代码
g++ src/server.cpp gen_cpp/message_types.cpp gen_cpp/message_constants.cpp gen_cpp/MessageService.cpp -o output/server -I"gen_cpp" -lthrift
3、实现服务端后,用类似的方法实现客户端
#include "MessageService.h"
#include
#include
#include
#include
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using boost::shared_ptr;
int main(int argc,char **argv)
{
//定义客户端并连接到9090本地IP服务器
shared_ptr
socket(new"localhost",9090); shared_ptr
transport(new TBufferedTransport(socket)); shared_ptr
protocol(new TBinaryProtocol(transport)); transport->open(); MessageServiceClient client(protocol); Message message; //调用服务器的服务函数 client.latestMessage(message); std::cout << message.id << std::endl; std::cout << message.content << std::endl; transport->close(); return 0; }
g++ src/client.cpp gen_cpp/message_types.cpp gen_cpp/message_constants.cpp gen_cpp/MessageServie.cpp -o output/client -I"gen_cpp" -lthrift
编译完成执行output/client,结果可以看到打印了两行。
1234aef30c
this is the latest message
到此结束,谢谢。