zoukankan      html  css  js  c++  java
  • ThriftUsageC++ Thrift Wiki

    ThriftUsageC++ - Thrift Wiki

    Getting started

     

    The first thing you need to know is that the C++ code generated by Thrift compiles only on Unix based systems, although some success has been reported using Cygwin on Win32 in ThriftInstallationWin32.   

     

    Requirements

     

    Make sure that your system meets the requirements as noted in ThriftRequirements   

    • Thrift library files  
    • Thrift header files.   

     

    Installing the Thrift library

     

    Installing the Thrift library is trivial to link with the generated code.   

    1. Download a snapshot of Thrift and extract if you haven't done so already - Direct Link  

    2. Navigate to lib/cpp using the terminal of your choice  

    3. Run  make to compile  

    4. Run  make install to install the library. Your user needs root permissions.   

     

    Generating the server code

     

    In this example we use an imaginary file called your_thrift_file.thrift:   

        

    #!/usr/local/bin/thrift --gen cpp
    
    namespace cpp Test
    
    service Something {
      i32 ping()
    }

    Now run:

     

    thrift --gen cpp your_thrift_file.thrift

     

    Exploring the generated code - The Server

    The generated code should be under the gen-cpp directory. You will see a number of generated C++ and header files along with an automatically generated server skeleton code (in bold).

    • Something.cpp
    • Something.h
    • Something_server.skeleton.cpp

    • your_thrift_file_constants.cpp
    • your_thrift_file_constants.h
    • your_thrift_file_types.cpp
    • your_thrift_file_types.h

     

    Implementing the Server

    Copy the generated server skeleton to a file named Something_server.cpp and keep the original:

     

    cp Something_server.skeleton.cpp Something_server.cpp

    When this server is run in console it prints "ping" on the console window each time the function is called from a client.

    Here's the autogenerated skeleton file to illustrate how to write a server: Something_server.cpp

     

    #include "Something.h"
    #include <protocol/TBinaryProtocol.h>
    #include <server/TSimpleServer.h>
    #include <transport/TServerSocket.h>
    #include <transport/TTransportUtils.h>
    
    using namespace apache::thrift;
    using namespace apache::thrift::protocol;
    using namespace apache::thrift::transport;
    using namespace apache::thrift::server;
    
    using boost::shared_ptr;
    
    using namespace Test;
    
    class SomethingHandler : virtual public SomethingIf {
     public:
      SomethingHandler() {
       // Your initialization goes here
      }
    
      int32_t ping() {
       // Your implementation goes here
        printf("ping\n");
      }
    
    };
    
    int main(int argc, char **argv) {
      int port = 9090;
      shared_ptr<SomethingHandler> handler(new SomethingHandler());
      shared_ptr<TProcessor> processor(new SomethingProcessor(handler));
      shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
      shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
      shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
    
      TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
      server.serve();
      return 0;
    }

     

    Compiling/Building the server

    To quickly build a binary using a single command use:

     

    g++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall -I/usr/local/include/thrift *.cpp -L/usr/local/lib -lthrift -o something

     

    Compiling

    You need to point your compiler to the thrift include path (CXX flag:  -I/usr/local/include/thrift)

     

    g++ -Wall -I/usr/local/include/thrift -c Something.cpp -o something.o
    g++ -Wall -I/usr/local/include/thrift -c Something_server.cpp -o server.o
    g++ -Wall -I/usr/local/include/thrift -c your_thrift_file_constants.cpp -o constants.o
    g++ -Wall -I/usr/local/include/thrift -c your_thrift_file_types.cpp -o types.o

     

    Linking

    You need to point your linker to the thrift library. (Linker flag:  -lthrift  or  -l/usr/local/lib/libthrift.so )

     

    g++ -L/usr/local/lib *.o -o Something_server -lthrift

     

    Writing the client code

    thrift does not auto generate a client interface, so you have to create the file.

     

    #include "Something.h"  // As an example
    
    #include <transport/TSocket.h>
    #include <transport/TBufferTransports.h>
    #include <protocol/TBinaryProtocol.h>
    
    using namespace apache::thrift;
    using namespace apache::thrift::protocol;
    using namespace apache::thrift::transport;
    
    using namespace Test;
    
    int main(int argc, char **argv) {
      boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
      boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
      boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
    
      SomethingClient client(protocol);
      transport->open();
      client.ping();
      transport->close();
    
      return 0;
    }

     

    Compiling

     

    g++ -Wall -I/usr/local/include/thrift -c Something_client.cpp -o client.o

     

    Linking

     

    g++ -L/usr/local/lib client.o Something.o constants.o types.o -o Something_client -lthrift

     

    Compiling/Building everything with Makefile

     

    GEN_SRC := Something.cpp your_thrift_file_constants.cpp your_thrift_file_types.cpp
    GEN_OBJ := $(patsubst %.cpp,%.o, $(GEN_SRC))
    
    THRIFT_DIR := /usr/local/include/thrift
    BOOST_DIR := /usr/local/include
    
    INC := -I$(THRIFT_DIR) -I$(BOOST_DIR)
    
    .PHONY: all clean
    
    all: something_server something_client
    
    %.o: %.cpp
            $(CXX) -Wall -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H $(INC) -c $Slt; -o $@
    
    something_server: Something_server.o $(GEN_OBJ)
            $(CXX) $^ -o $@ -L/usr/local/lib -lthrift 
    
    something_client: Something_client.o $(GEN_OBJ)
            $(CXX) $^ -o $@ -L/usr/local/lib -lthrift 
    
    clean:
            $(RM) *.o something_server something_client

     

    Appendix: About TNonblockingServer

    If you are writing an application that will serve a lot of connection (like php front end calling thrift service), you'd better use TNonblockingServer. TNonblockingServer can accept a lot of connections while throttling the processor threads using a pool.

    * TNonblockingServer with a thread pool is the c++ alternative of the JAVA THsHaServer; * TNonblockingServer withOUT a thread pool is the c++ alternative of the JAVA TNonblockingServer;

    Server code with thread pool:

        shared_ptr<TProcessor> processor(new SomethingProcessor(handler));
        shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
    
        // using thread pool with maximum 15 threads to handle incoming requests
        shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(15);
        shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
        threadManager->threadFactory(threadFactory);
        threadManager->start();
        TNonblockingServer server(processor, protocolFactory, 8888, threadManager);
        server.serve();
    
        // ...

    C++ client code (you have to use TFramedTransport here):

        boost::shared_ptr<TSocket> socket(new TSocket("localhost", 8888));
        boost::shared_ptr<TTransport> transport(new TFramedTransport(socket));
        boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
    
        SomethingClient client(protocol);
        transport->open();
        // do something here...
        transport->close();

    PHP client code (you have to use TFramedTransport here):

        $transport = new TFramedTransport(new TSocket("localhost", 8888));
        $transport->open();
        $protocol = new TBinaryProtocol($transport);
        $client= new SomethingClient($protocol, $protocol);
        // do something here...
        transport->close();
  • 相关阅读:
    java中的线程是如何工作的。
    springcloud 负载均衡之 ribbon。
    eureka 集群的实现方式?
    eureka的简单介绍,eureka单节点版的实现?eureka的自我保护?eureka的AP性,和CP性?
    docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。
    关于自动化测试框架的思想和考虑
    Web应用程序压力测试步骤
    自动化测试工具的选择
    软件测试用例的认识误区
    如何评估软件产品的质量?
  • 原文地址:https://www.cnblogs.com/lexus/p/2971088.html
Copyright © 2011-2022 走看看