本文章也同時發表在我的博客Thrift在Windows及Linux平臺下的安裝和使用示例上。html
Apache Thrift 是 Facebook 實現的一種高效的、支持多種編程語言的RPC(遠程服務調用)框架。linux
本文主要目的是分別介紹在Windows及Linux平臺下的Thrift安裝步驟,以及實現一個簡單的demo演示Thrift的使用方法。更多Thrift原理留在之後再行介紹。git
源碼下載:thrift官網,或者thrift-github地址,我下載的是thrift-0.9.3.tar.gz。github
我是在Windows7 64bit, VS2010編譯的。 Windows下編譯倒也不麻煩,簡單介紹以下:apache
說明: thrift-0.9.3這一版的release其實在windows下是編譯不過的,由於vs工程中要編譯的Thrift.cpp已經不存在了,從工程中移除就能夠順利編譯了,參考thrift-pull-739。編程
另外還能夠自行編譯thrift文件的生成工具,固然也能夠直接從官網下載,這裏給出編譯步驟:windows
我是在Centos6.4 64bit,g++ 4.4.7編譯的,編譯很簡單,分別可使用cmake或者make工具進行編譯,這裏再也不多作介紹,固然,編譯過程當中缺乏了某些庫什麼的,就先按照便可,更詳細的步驟請看本文的參考文章連接。centos
下面就演示一個簡單的server端和client端程序。框架
假設實現這麼一個簡單服務,client經過hello接口發送本身的名字,且須要server端回覆,好比 hello.thrift:異步
service HelloService { void hello(1: string name); }
執行thirift命令生成源文件:
thrift --gen cpp hello.thrift # centos下 thrift-0.9.3.exe --gen cpp hello.thrift # Windows下
以上命令表示生成C++語言的源代碼,而後會生成一個gen-cpp目錄,裏面包含自動生成的幾個源代碼文件:
hello_constants.cpp hello_constants.h HelloService.cpp HelloService.h HelloService_server.skeleton.cpp hello_types.cpp hello_types.h
HelloService_server.skeleton.cpp就是默認的server端程序入口,能夠直接修改該文件,或者拷貝一份再作修改(我是拷貝並重命名爲server.cpp),以便增長本身的邏輯處理:
class HelloServiceHandler : virtual public HelloServiceIf { public: HelloServiceHandler() { // Your initialization goes here } void hello(const std::string& name) { // Your implementation goes here // 這裏只簡單打印出client傳入的名稱 printf("hello, I got your name %s\n", name.c_str()); } };
若是是在linux平臺下,直接經過g++編譯:
g++ -o server hello_constants.cpp HelloService.cpp hello_types.cpp server.cpp -I/usr/local/include/thrift -L/usr/local/lib -lthrift
若是是在Windows平臺下,經過vs2010新建win32控制檯工程,將gen-cpp目錄下的全部文件複製到新工程下,設置頭文件包含和lib庫目錄。 好比設置libthrift.lib的頭文件目錄爲thrift-0.9.3\lib\cpp\src\thrift,lib庫目錄爲thrift-0.9.3\lib\cpp\Debug。
由於沒有默認的client實現,因此須要新建一個client.cpp文件,本身增長實現:
#include <stdio.h> #include <string> #include "transport/TSocket.h" #include "protocol/TBinaryProtocol.h" #include "server/TSimpleServer.h" #include "transport/TServerSocket.h" #include "transport/TBufferTransports.h" #include "hello_types.h" #include "HelloService.h" using namespace ::apache::thrift; using namespace ::apache::thrift::protocol; using namespace ::apache::thrift::transport; using namespace ::apache::thrift::server; using boost::shared_ptr; int main(int argc, char** argv) { shared_ptr<TTransport> socket(new TSocket("localhost", 9090)); shared_ptr<TTransport> transport(new TBufferedTransport(socket)); shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport)); HelloServiceClient client(protocol); try { transport->open(); client.hello("cpper.info"); transport->close(); } catch(TException& tx) { printf("ERROR:%s\n",tx.what()); } }
若是是在linux平臺下,直接經過g++編譯:
g++ -o client client.cpp hello_constants.cpp HelloService.cpp hello_types.cpp -I/usr/local/include/thrift -L/usr/local/lib -lthrift
若是是在Windows平臺下,經過vs2010新建win32控制檯工程,將gen-cpp目錄下的全部文件(除HelloService_server.skeleton.cpp以外)複製到新工程下,並增長上面手動實現的client.cpp。
經過以上步驟,就實現一個簡單的RPC server和client程序了,能夠分別運行進行測試看看效果怎麼樣。