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!

  • 相关阅读:
    TextView中文文档
    低版本系统兼容的ActionBar(六)用Fragment+ViewPager+Tab实现快速导航
    低版本系统兼容的ActionBar(五)修改ActionBar的全套样式,从未如此简单过
    低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图+Fragment
    低版本系统兼容的ActionBar(三)自定义Item视图+进度条的实现+下拉导航+透明ActionBar
    低版本系统兼容的ActionBar(二)ActionProvider+分离式ActionBar+分离式的ActionMode
    Android中获取屏幕长宽的方法
    低版本系统兼容的ActionBar(一)设置颜色+添加Menu+添加ActionMode
    用PopupWindow实现弹出菜单(弹出的菜单采用自定义布局)
    Android Studio 下载地址
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5257178.html
Copyright © 2011-2022 走看看