Apache Thrift 在Windows下的安装与开发
Windows下安装Thrift框架的教程很多。本文的不同之处在于,不借助Cygwin或者MinGW,只用VS2010,和Thrift官网下载的源文件,安装Thrift并使用。
先从官网 下载这两个文件:
· Thrift compiler for Windows (thrift-0.9.1.exe)
第一个文件是源代码包,第二个可执行文件用于在Windows下生成目标语言的桩代码。
除此以外,还需要boost库和libevent库。
安装Thrift
0)准备工作
thrift-0.9.1.tar.gz源码包
安装VS2010
安装boost库,我使用的boost1.51版本
安装libevent库,这里用的libevent-2.0.21-stable
1)解压缩thrift-0.9.1.tar.gz
进入\thrift-0.9.1\lib\cpp,VS2010打开Thrift.sln,有libthrift,libthriftnb两个工程。
两个工程的区别是,libthriftnb工程是非阻塞(non-blocking)模式的服务器,非阻塞模式需要依赖libevent库。
2)libthrift工程配置:
libthrift>属性->C/C++->常规->附加包含目录->\boost\boost_1_51
libthrift>属性->库管理器->常规->附加库目录->\boost\boost_1_51\lib
3)libthriftnb工程配置:
libthriftnb>属性->C/C++->常规->附加包含目录->
\boost\boost_1_51
\libevent-2.0.21-stable
\libevent-2.0.21-stable\include
\libevent-2.0.21-stable\WIN32-Code
libthriftnb>属性->库管理器->常规->附加库目录->
\boost\boost_1_51\lib
4)编译libthrift和libthriftnb工程
编译完成后,在\thrift-0.9.1\lib\cpp\Debug下生成libthrift.lib文件,和libthriftnb.lib文件。
选择release模式,则在\thrift-0.9.1\lib\cpp\Release下生成libthrift.lib文件和libthriftnb.lib文件。
至此,安装完成。
开发步骤
安装好thrift后,就可以开始开发了。开发过程分这么几步:
第1步: 写.thrift文件,也就是接口描述文件(Interface Description File);
第2步: 用Thrift compiler for Windows (thrift-0.9.1.exe) ,生成目标语言代码;
第3步: 服务器端程序引入thrift生成的代码,实现RPC业务代码。
第4步: 客户端引入代码,调用远程服务。
图中蓝色Thrift.exe就是从官网下载的第二个文件——“IDL翻译工具”,帮助你把.thrift文件“翻译”成目标语言的RPC代码。
例子
这个例子,远程Server提供一个函数。客户端调用这个函数。远程函数的功能很简单,就是输出“Hello Thrift”。
1)写.thrift文件
新建文本文件hello.txt,保存下面的内容后修改扩展名hello.thrift
1 service hello { 2 void func1( ) 3 }
2)生成目标语言代码
把官网下载到的第二个文件thrift-0.9.1.exe和hello.thrift放到一个目录(hello)下。
打开cmd命令行窗口,进入到这个目录,执行命令:
C:\Users\admin\Desktop\Hello>thrift-0.9.1.exe --gen cpp hello.thrift
执行成功,在hello目录下,生成一个gen-cpp文件夹。
3)创建工程
Visual Studio 2010新建win32控制台应用程序。
项目名称 server
解决方案名称 hello
注意:附加选项中选择 勾选 空项目。
类似的,在hello解决方案下,再新建一个空项目client。
4)为项目添加文件
向Server项目添加文件。
复制gen-cpp文件夹中文件到Server工程,添加到Server工程中。
向Client项目添加文件。
复制gen-cpp文件夹中文件到Client工程,删除hello_server.skeleton.cpp,并额外添加client.cpp文件。
最终解决方案的文件结构是这样的:
5)配置项目属性
Sever工程 Server>属性->C/C++->常规->附加包含目录->\boost\boost_1_51
Sever工程 Server>属性->C/C++->常规->附加包含目录->\thrift-0.9.1\lib\cpp\src
Sever工程 Server>属性->C/C++->常规->附加包含目录->\thrift-0.9.1\lib\cpp\src\thrift
Sever工程 Server>属性->连接器->附加库目录->\boost\boost_1_51\lib
Sever工程 Server>属性->连接器->附加库目录->\thrift-0.9.1\lib\cpp\Debug
附加库目录指向的是刚刚编译出的Debug目录
类似的,Client工程也做这样的配置。
Client工程 Client>属性->C/C++->常规->附加包含目录->\boost\boost_1_51
Client工程 Client>属性->C/C++->常规->附加包含目录->\thrift-0.9.1\lib\cpp\src
Client工程 Client>属性->C/C++->常规->附加包含目录->\thrift-0.9.1\lib\cpp\src\thrift
Client工程 Client>属性->连接器->附加库目录->\boost\boost_1_51\lib
Client工程 Client>属性->连接器->附加库目录->\thrift-0.9.1\lib\cpp\Debug
6)Client代码
client.cpp文件是空的,添加代码:
1 #include <transport/TSocket.h> 2 #include "hello.h" 3 #include <protocol/TBinaryProtocol.h> 4 #include <server/TSimpleServer.h> 5 #include <transport/TServerSocket.h> 6 #include <transport/TBufferTransports.h> 7 #include <string> 8 #pragma comment(lib, "libthrift.lib") 9 using namespace ::apache::thrift; 10 using namespace ::apache::thrift::protocol; 11 using namespace ::apache::thrift::transport; 12 using namespace ::apache::thrift::server; 13 14 using boost::shared_ptr; 15 16 #pragma comment(lib,"libthrift.lib")//链接库文件 17 18 int main(int argc, char** argv) { 19 int port = 9090; 20 shared_ptr<TTransport> socket(new TSocket("127.0.0.1", 9090)); 21 shared_ptr<TTransport> transport(new TBufferedTransport(socket)); 22 shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); 23 helloClient client(protocol); 24 try{ 25 transport->open(); 26 27 client.func1(); 28 29 transport->close(); 30 }catch(TException& tx){ 31 printf("ERROR:%s\n",tx.what()); 32 } 33 getchar(); 34 return 0; 35 }
7)Server代码
hello_server.skeleton.cpp 文件已经有thrift生成的代码,稍作修改,最终如下:
1 // This autogenerated skeleton file illustrates how to build a server. 2 3 // You should copy it to another filename to avoid overwriting it. 4 5 6 7 #include "hello.h" 8 9 #include <thrift/protocol/TBinaryProtocol.h> 10 11 #include <thrift/server/TSimpleServer.h> 12 13 #include <thrift/transport/TServerSocket.h> 14 15 #include <thrift/transport/TBufferTransports.h> 16 17 #pragma comment(lib, "libthrift.lib") 18 19 using namespace ::apache::thrift; 20 21 using namespace ::apache::thrift::protocol; 22 23 using namespace ::apache::thrift::transport; 24 25 using namespace ::apache::thrift::server; 26 27 28 29 using boost::shared_ptr; 30 31 32 33 class helloHandler : virtual public helloIf { 34 35 public: 36 37 helloHandler() { 38 39 // Your initialization goes here 40 41 } 42 43 44 45 void func1() { 46 47 // Your implementation goes here 48 49 printf("Hello Thrift\n"); 50 51 } 52 53 }; 54 55 56 57 int main(int argc, char **argv) { 58 59 //-----------------------------// 60 WORD wVersionRequested; 61 62 WSADATA wsaData; 63 64 int err; 65 66 wVersionRequested =MAKEWORD( 2, 2 ); 67 68 err = WSAStartup( wVersionRequested, &wsaData ); 69 //-------------------------------// 70 //对上面这段代码做个说明,这是依赖windows的一段代码 71 //到2014.9.2官网的稳定版0.9.1,仍需要这段代码才可以在windows下编译通过。 72 //但是如果用git clone最新版,这个错误已经修正 73 //最新版注释掉这段代码,一样可以在windows下编译通过。 74 //备注时间:2014.9.2 75 76 77 int port = 9090; 78 79 shared_ptr<helloHandler> handler(new helloHandler()); 80 81 shared_ptr<TProcessor> processor(new helloProcessor(handler)); 82 83 shared_ptr<TServerTransport> serverTransport(new TServerSocket(port)); 84 85 shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory()); 86 87 shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); 88 89 90 91 TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory); 92 93 server.serve(); 94 95 return 0; 96 97 }
8)调试运行
先启动Server工程,再启动Client工程。运行结果:
总结
到这里Thrift的安装和开发基本操作步骤就介绍完了。Thrift的官方文档不是很完善,本篇介绍的安装方法不在网上众多教程之列,主要区别是没有使用Cygwin或者MinGW。对于想使用Visual Studio作为开发环境的同学会很有帮助。
教程中需要的文件,都可以从网上获取,核心代码在文中已经展示,相信按图索骥一定可以成功的运行第一个Thrift的例子。
最后十分感谢陈晓苏(北京)同学,本篇教程整理自他/她名字的一个文件夹。我从Thrift交流QQ群193713524的共享中获得的。这里增加了一些图片说明和我的理解。最后的例子,做了简化,是为了直接、清晰的说明安装过程和开发的配置。
转自:http://blog.csdn.net/colouroo/article/details/38588297