您的位置:首页 > 运维架构 > Apache

Linux下配置RPC框架Apache Thrift

2017-09-01 13:54 274 查看
Thrift最初生于Facebook,并茁壮成长,在2007年由Facebook正式开源出来,2008年由Apache软件基金会开始负责项目孵化直至今日。Thrift的全名叫做Apache Thrift,是一款由 Facebook 开发的远程服务调用框架框架,它可以很高效地实现跨语言的RPC服务。

github地址:https://github.com/apache/thrift

最新的版本是0.10.0:http://archive.apache.org/dist/thrift/0.10.0/

Thrift采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。本文将介绍 Apache Thrift的配置和简单使用,并加以解释说明,帮助读者快速用Thrift构建服务。

Apache Thrift安装依赖于Boost1.53及以上,本文采用Boost1.53来安装Apache Thrift。

1.下载Boost1.53源代码包并编译安装:

wget https://nchc.dl.sourceforge.net/project/boost/boost/1.53.0/boost_1_53_0.tar.gz tar -xzvf boost_1_53_0.tar.gz
cd boost_1_53_0
./bootstrap.sh
./b2 install --prefix=/usr    #指定boost库的安装位置
ldconfig


2.下载thrift-0.10.0源代码包并编译安装:

wget http://archive.apache.org/dist/thrift/0.10.0/thrift-0.10.0.tar.gz tar -xzvf thrift-0.10.0.tar.gz
cd thrift-0.10.0
./configure --with-boost=/usr   #指出boost库的安装位置
make -j8 && make install
ldconfig


接下来我们实现一个简单的功能:调用远程主机来计算两个的加减乘除,并把结果返回给本机。

首先自己新建一个文件,叫testping.thrift,如下:

# testping.thrift

/**
* Thrift files can namespace, package, or prefix their output in various
* target languages.
*/
namespace cpp freebird

/**
* Defining a removed class named WorkerManager
*/
service WorkerManager {

/**
* client calls ping method to make sure service process is active or dead
*/
void ping()

}


然后在testping.thrift文件所在目录执行:

thrift -r --gen cpp testping.thrift


这会在当前目录新建一个文件夹gen-cpp,cd进入到gen-cpp目录,执行tree ..命令,可以看到如下打印信息:

..
├── gen-cpp
│   ├── testping_constants.cpp
│   ├── testping_constants.h
│   ├── testping_types.cpp
│   ├── testping_types.h
│   ├── WorkerManager.cpp
│   ├── WorkerManager.h
│   └── WorkerManager_server.skeleton.cpp
└── testping.thrift

1 directory, 8 files


可见上面脚本执行后一口气生成了八个文件。

其中WorkerManager_server.skeleton.cpp文件如下:

// This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.

#include "WorkerManager.h"
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TBufferTransports.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  ::freebird;

class WorkerManagerHandler : virtual public WorkerManagerIf {
public:
WorkerManagerHandler() {
// Your initialization goes here
}

/**
* client calls ping method to make sure service process is active or dead
*/
void ping() {
// Your implementation goes here
printf("counting....\n");
}
/*
void show_result(int a,int b)
{
printf("+ result is: %d\n - result is :%d\n * result is :%d\n / result is :%d\n",a+b,a-b,a*b,a/b);
}
*/

};

int main(int argc, char **argv) {
int port = 9090;
shared_ptr<WorkerManagerHandler> handler(new WorkerManagerHandler());
shared_ptr<TProcessor> processor(new WorkerManagerProcessor(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;
}


这里我们可以看到它绑定了9090端口并监听来自客户端的请求。

其实上面服务端的代码已经完成了,接下来编译生成server执行文件:

g++ -g -I/usr/local/include/thrif -L /usr/local/lib -lthrift testping_constants.cpp WorkerManager_server.skeleton.cpp WorkerManager.cpp testping_types.cpp -o server
#-I 链接include目录,-L链接lib文件


接下来提前开启服务端的监听:

./server


至此,服务端配置完成,监听也已经开启。

然后在另一台主机装好Apache Thrift,并用上面同样的方式生成客户端代码。

进入到客户端机器的gen-cpp目录,执行:

touch Client.cpp
gedit Client.cpp


键入以下代码:

#include "WorkerManager.h"  // Your .h File
#include <iostream>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TBinaryProtocol.h>
using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using boost::shared_ptr;

using namespace  ::freebird;

int main(int argc, char **argv) {
boost::shared_ptr<TSocket> socket(new TSocket("server_host_ip", 9090));  //替换IP
boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
WorkerManagerClient client(protocol);
int a =6;
int b=3;
transport->open();

// Your Codes
client.ping();
//client.show_result(a,b);
transport->close();
return 0;
}


然后编译并执行代码并开启客户端请求:

g++ -g -I/usr/local/include/thrif -L /usr/local/lib -lthrift testping_constants.cpp Client.cpp WorkerManager.cpp testping_types.cpp -o client
#-I 链接include目录,-L链接lib文件
./client


如果提示:

error while loading shared libraries: libthriftc.so.0: cannot open shared object file: No such file or directory


可以编辑~/.bashrc文件:

vim ~/.bashrc


加入以下内容:

export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH  #thrift lib所在目录


然后保存生效:

source ~/.bashrc


接下来就应该没问题了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  thrift-c++ apache linux RPC