Thrift 入門教程
阿新 • • 發佈:2019-01-14
Thriftr入門教程
Thrift開發概述
Thrift用介面描述語言(Interface description language,IDL)來描述不同程式語言之間的介面。Thrift開發環境包含兩個部分:Thrift編譯器和語言相關的庫。Thrift編譯器用來根據IDL生成語言相關的介面程式碼框架,我們可以使用這個框架很方便的實現客戶端和伺服器的程式碼。語言相關的庫則封裝了不同程式語言之間通訊的內部實現,讓我們解放雙手著重處理業務邏輯。根據程式語言的不同,構建相關庫的方法也不同。
開發前的準備
根據上一篇的《Redhat7.1安裝Thrift》教程,安裝Thrift開發環境
開發流程
- 在Redhat環境,使用Thrift的IDL定義伺服器和客戶端之間的介面。利用Thrift編譯器編譯該IDL檔案,生成語言相關的程式碼框架。
- 利用已經生成的程式碼框架,實現客戶端和伺服器的業務邏輯。
C++開發例項
本例環境:Redhat7.1 + Xshell
- 定義介面
建立一個專案資料夾
mkdir -v ThriftDemo
cd ./ThriftDemo
建立一個IDL檔案
vi ./ICalc.thrift
編寫如下程式碼並儲存
service ICalc {
i32 add(1:i32 num1, 2:i32 num2),
}
編譯生成C++檔案
thrift -r --gen cpp ICalc.thrift
編譯 ThriftDemo 專案,編譯後會在工程目錄下生成 gen-cpp 目錄,該目錄包含的檔案如下。其中 ICale.h 和 ICale.cpp 是介面的實現檔案,其中實現了RPC。ICalc_types.h、ICalc_types.cpp、 ICalc_constants.h、ICalc_constants.cpp 四個檔案實現了介面中定義的型別和常量。ICale_server.skeleton.cpp是伺服器框架程式碼,實際開發中可以直接使用這個檔案實現伺服器業務邏輯。
修改ICale_server.skeleton.cpp的add函式實現
int32_t add(const int32_t num1, const int32_t num2) {
// Your implementation goes here
return num1 + num2;
}
- 建立一個入口檔案
vi ./ICale_Main.cpp
編寫如下程式碼並儲存
#include <protocol/TBinaryProtocol.h>
#include <transport/TSocket.h>
#include <transport/TTransportUtils.h>
#include <iostream>
#include "ICale.h"
using namespace std;
using namespace boost;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
int main(int argc, char const *argv[]) {
boost::shared_ptr<TTransport> socket(new TSocket("192.168.1.127",8009));//可改成自己伺服器IP
boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
ICaleClient client(protocol);
try {
transport->open();
int32_t sum = client.add(1, 2);
std::cout << sum << std::endl;
transport->close();
}
catch(TException& tx) {
std::cout << "ERROR: " << tx.what() << std::endl;
}
pause();
return 0;
}
- 建立Makfile檔案
CC=gcc
CXX=g++
AR=ar
AROPT=-scurv
COMOPT=-g -c -Wall -std=c++0x
CFLAGS= -o3 -Wall -g -std=c++0x
BASICDIR=/usr
BASICINCDIR= $(BASICDIR)/include
BASICLIB= $(BASICDIR)/lib -L/usr/local/thrift/lib \
BASICINC= -I$(BASICINCDIR) -I/usr/include/thrift \
BASICLIBLINK= -L$(BASICLIB) -lthrift \
all: ICale_server ICale_Main \
ICale_server: ICale_server.skeleton.o ICale.o ICalc_types.o ICalc_constants.o
$(CXX) $(CFLAGS) -o [email protected] $^ -L$(BASICLIB) $(BASICLIBLINK)
strip [email protected]
ICale_Main: ICale_Main.o ICale.o
$(CXX) $(CFLAGS) -o [email protected] $^ -L$(BASICLIB) $(BASICLIBLINK)
strip [email protected]
clean:
rm -f *.o ICale_server ICale_Main
%.o: %.cpp
$(CXX) $(COMOPT) $(BASICINC) $<
- 編譯生成可執行程式
# make all
- 執行可執行程式
#./ICale_server
#./ICale_Main
//顯示以下結果
# 3
文章引用與參考
【1】https://blog.csdn.net/u011304970/article/details/73298337/