Apache Thrift基于RPC的远程调用 c++

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

到此结束,谢谢。


你可能感兴趣的:(c++,c++,thrift)