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

apache thrift C++入门实践

2017-12-13 22:38 721 查看
什么是thrift?

thrift是一个跨语言的RPC(远程调用)框架,它可以被用作不同语言编写的服务之间的RPC通信,它使用声明式语法,带有一个强大的代码生成引擎,使用时首先编写thrift文件进行各种变量和数据结构的声明,然后使用thrift编译器将该文件编译成指定语言,一般命令行格式为thrift.exe -r --gen [lang] source.thrift,默认会在当前目录生成一个gen_[lang]的文件夹,里面是编译好的服务器端文件,名为XX_server.skeleton.cpp的文件为服务器端的实现文件,开发者可以在此文件中填写服务器端需要暴露给客户端调用的函数的具体实现,而客户端文件可以参考XX_server.skeleton.cpp并根据实际需要由我们自己来编写.

开发环境
Windows 7,使用thrift 0.10.0 + Visual Studio 2010或以上版本

下载并安装依赖项

我们需要首先下载boost 1.65.0, OpenSSL for Windows, Win flex-bison, libevent并安装/解压它们.

解压boost包,依次执行bootstrap.bat和b2.exe进行编译,然后添加环境变量BOOST_ROOT指向boost所在路径
安装OpenSSL for windows,这是OpenSSL为windows平台提供的一个安装程序,然后添加环境变量OPENSSL_ROOT_DIR指向安装目录
解压win flex-bison, 并将win-flex和win-bison重命名为flex, bison,将解压后的根目录加入PATH环境变量
解压libevent,往根目录下的三个文件event_iocp.c, evthread_win32.c, listener.c中添加预定义: #define _WIN32_WINNT 0x0501,然后打开Developer Command Prompt for VS2010,切换到libevent顶层目录并执行nmake /f Makefile.nmake,这将会在根目录下生成三个library: libevent.lib libevent_core.lib libevent_extras.lib

编译libthrift
在C++工程中使用thrift需要首先编译好thrift的两个静态库.在官网下载thrift源码(当前版本是0.10.0),在thrift/lib/cpp/下有一个官方提供的Visual Studio 2010解决方案(*.sln),但是该解决方案里的libthrift工程无法直接使用,需要我们进行一些修改, 应该是官方的失误.

打开3rdparty.props文件, 把\boost_1_47_0修改为你使用的boost库版本(我使用1.47.0编译时有问题,所以换成了1.65.0)

打开VS工程,添加以下缺失文件(目录里有但是官方给的VS工程里忘加了,不加也可以编译成功但链接静态库时会报错):

src/thrift/server/TConnectedClient.h

src/thrift/server/TServerFramework.h

src/thrift/server/TConnectedClient.cpp

src/thrift/server/TServer.cpp

src/thrift/server/TServerFramework.cpp

编译之后应该生成libthrift.lib和libthriftnb.lib两个静态库

编写thrift文件
具体语法可上官网查询

编译thrift文件到C++

thrift.exe -r --gen cpp source.thrift

默认会在当前目录生成一个名为gen-cpp的文件夹,以及以下几个公用文件(服务器端和客户端都要用到):

ServiceName.cpp

ServiceName.h

source_constants.cpp

source_constants.h

source_types.cpp

source_types.h

以及一个服务器端文件

ServiceName_server.skeleton.cpp, 你可以在这里实现函数体

编写客户端文件client.cpp

该文件可以参考ServiceName_server.skeleton.cpp编写, 需要我们修改几个地方

首先删除没用的类定义

然后添加需要的头文件#include <thrift/transport/TSocket.h>

再修改main函数如下

int main(int argc, char **argv)
{
shared_ptr<TSocket> socket(new TSocket("127.0.0.1", 9090));
shared_ptr<TTransport> transport(new TBufferedTransport(socket));
shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
ServiceNameClient client(protocol);
try
{
transport->open();
}
catch (TTransportException)
{
transport->close();
}

//随意调用thrift文件定义好的函数
int ret_int1 = client.func1();
int ret_int2 = client.func2(arg1, arg2);
...

transport->close();
return 0;
}
使用Visual Studio分别创建服务器端和客户端工程即可编译出相应的程序,可以自己尝试运行一下

有些同学可能不知道如何使用Visual Studio进行编译,顺便说一下
服务器端:
首先创建一个名为server的空工程,删除多余的文件,把thrift compiler编译出的所有文件都加到工程里去,并在工程配置中添加相应的Additional Include Directories,Additional Library Directories和Additional Dependencies即可
客户端:

首先创建一个名为client的空工程,删除多余的文件,把所有公用文件都加到工程里去,再加入上面写的那个client.cpp文件,并在工程配置中添加相应的Additional Include Directories,Additional Library Directories和Additional Dependencies即可

以下配置值仅供参考

Additional Include Directories = $(BOOST_ROOT);thrift\lib\cpp\src;$(OPENSSL_ROOT_DIR)\include

Additional Library Directories = $(BOOST_ROOT)\stage\lib;thrift\lib\cpp\$(Configuration);$(OPENSSL_ROOT_DIR)\lib

Additional Dependencies = libthrift.lib;libthriftnb.lib;libcrypto.lib;libssl.lib
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息