zoukankan      html  css  js  c++  java
  • Thrift的安装和简单演示样例

    本文仅仅是简单的解说Thrift开源框架的安装和简单使用演示样例。对于具体的解说,后面在进行阐述。

    Thrift简述                                                                       

    Thrift是一款由Fackbook开发的可伸缩、跨语言的服务开发框架,该框架已经开源而且增加的Apache项目。Thrift主要功能是:通过自己定义的Interface Definition Language(IDL),能够创建基于RPC的client和服务端的服务代码。服务代码的生成是通过Thrift内置的代码生成器来实现的。Thrift的跨语言性体如今,它能够生成C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml , Delphi等语言的代码,且它们之间能够进行透明的通信。


    Thrift的安装                                                                   

    安装版本号为:Thrift v0.9.1

    系统版本号:Ubuntu 14.04 64位

    基本安装环境:

    • g++ 4.2
    • boost 1.53.0
    • libssl-dev
    • libevent & libevent-dev(不是必须的,支持TNonblockingServer须要)

    Thrift的编译器即代码生成器是由C++编写的,所以须要g++来进行编译安装,且Thrift源代码中用到了boost库中相关实现,比如shared_ptr。所以要事先安装boost库。

    Thrift通信过程中使用ssl对数据进行安全保护,假设没有安装该库,会在configure时出现configure: error: "Error: libcrypto required."

    Thrift提供了。TThreadSever, TThreadPoolServer, TNonblockingServer四种server框架,TSimpleServer以单一主线程堵塞的方式进行事件处理。TThreadPoolServer以多线程堵塞的方式提供服务。TNonblockingServer以多线程非堵塞方式工作。

    TNonblockingServer服务模型的使用须要事先安装libevent。libevent-dev库,libevent是异步事件处理的网络库,其底层通过系统支持的I/O multiplexer :poll,select,epoll等进行事件监听和分发。

    安装步骤:

    $./configure
    $make
    #sudo make install
    configure的结果最后一部分例如以下。当中Build TNonblockingServer .. : yes的结果对于使用异步的server模型是必须的。

    anonymalias@anonymalias-Rev-1-0:~/download/thrift-0.9.1$./configure
    ......
    thrift 0.9.1
    
    Building C++ Library ......... : yes
    Building C (GLib) Library .... : no
    Building Java Library ........ : no
    Building C# Library .......... : no
    Building Python Library ...... : yes
    Building Ruby Library ........ : no
    Building Haskell Library ..... : no
    Building Perl Library ........ : no
    Building PHP Library ......... : no
    Building Erlang Library ...... : no
    Building Go Library .......... : no
    Building D Library ........... : no
    
    C++ Library:
       Build TZlibTransport ...... : yes
       Build TNonblockingServer .. : yes
       Build TQTcpServer (Qt) .... : no
    
    Python Library:
       Using Python .............. : /usr/bin/python
    
    If something is missing that you think should be present,
    please skim the output of configure to find the missing
    component.  Details are present in config.log.
    在本人电脑上make的时候会出现以下的bug,
    ar: .libs/ThriftTest_constants.o: No such file or directory

    不知道Makefile怎样生成的,导致上面这个编译文件路径有问题,解决方法有以下两种:

    method1:
    能够将已经编译的test/cpp/*.o拷贝到test/cpp/.libs后。继续编译就能够了
    cp test/cpp/*.o test/cpp/.libs/
    
    method2(未測试):
    直接从Github(git://git.apache.org/thrift.git)上git clone 源代码,先执行./bootstrap.sh。在依照configure安装。

    Thrift的简单演示样例                                                            

    首先创建Thrift的语法规则文件,命名为server.thrift,内容例如以下:

    struct message
    {
    	1:i32 seqId,
    	2:string content
    }
    
    service serDemo
    {
    	void put(1:message msg)
    }
    
    在shell以下运行运行:

    thrift -gen cpp server.thrift
    该语句用于创建c++服务框架,创建成功后会在该文件夹下生成gen-cpp文件夹,然后改动该文件夹下的serDemo_server.skeleton.cpp,在put函数中加入例如以下代码:
    class serDemoHandler : virtual public serDemoIf {
     public:
      serDemoHandler() {
        // Your initialization goes here
      }
    
      void put(const message& msg) {
        // Your implementation goes here
        printf("receive message: id: %d, content: %s
    ", msg.seqId, msg.content.c_str());
      }
    
    然后进行编译就能够了:g++ -o server *.cpp -lthrift

    上面是server框架的代码,对于client的框架事实上已经创建。可是如今须要加入client运行代码,能够在该文件夹下创建client.cpp,然后输入以下内容,以下的内容能够作为SimpleServer的client的模板,仅仅需改动凝视的部分。

    // -------------------------替换成相应service名字的.h  文件------------------------
    #include "SerDemo.h"  
    //------------------------------------------------------------------------------
    #include <thrift/transport/TSocket.h>  
    #include <thrift/transport/TBufferTransports.h>  
    #include <thrift/protocol/TBinaryProtocol.h>  
      
    using namespace apache::thrift;  
    using namespace apache::thrift::protocol;  
    using namespace apache::thrift::transport;  
      
    using boost::shared_ptr;  
      
    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));  
      
        transport->open();  
      
        // ----------------------------我们的代码写在这里------------------------------
        message msg;
        msg.seqId = 1;
        msg.content = "client message";
    
        serDemoClient client(protocol);
        client.put(msg);
        //--------------------------------------------------------------------------
    
        transport->close();  
      
        return 0;  
    }
    然后进行编译:g++ -o client *[^n].cpp - lthrift,也能够将serDemo_server.skeleton.cpp移动到其他文件夹,使用g++ -o client *.cpp - lthrift命令。

    然后就能够运行了。启动server后。启动client。server运行例如以下:

    anonymalias@anonymalias-Rev-1-0:~/code/thriftSerDemo/gen-cpp$ ./server 
    receive message: id: 1, content: client message
    

    下周打算翻译Thrift Whitepaper,come on!

  • 相关阅读:
    【Java EE 学习 81】【CXF框架】【CXF整合Spring】
    【Java EE 学习 80 下】【调用WebService服务的四种方式】【WebService中的注解】
    【Java EE 学习 80 上】【WebService】
    【Java EE 学习 79 下】【动态SQL】【mybatis和spring的整合】
    【Java EE 学习 79 上】【mybatis 基本使用方法】
    【Java EE 学习 78 下】【数据采集系统第十天】【数据采集系统完成】
    【Java EE 学习 78 中】【数据采集系统第十天】【Spring远程调用】
    【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
    【Java EE 学习 77 下】【数据采集系统第九天】【使用spring实现答案水平分库】【未解决问题:分库查询问题】
    【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5257178.html
Copyright © 2011-2022 走看看