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\n", 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!

上一篇:mysql学习4


下一篇:使用Java8中的Optional类来消除代码中的null检查