1. 程式人生 > >Thrift 入門教程

Thrift 入門教程

Thriftr入門教程

Thrift開發概述

Thrift用介面描述語言(Interface description language,IDL)來描述不同程式語言之間的介面。Thrift開發環境包含兩個部分:Thrift編譯器和語言相關的庫。Thrift編譯器用來根據IDL生成語言相關的介面程式碼框架,我們可以使用這個框架很方便的實現客戶端和伺服器的程式碼。語言相關的庫則封裝了不同程式語言之間通訊的內部實現,讓我們解放雙手著重處理業務邏輯。根據程式語言的不同,構建相關庫的方法也不同。

開發前的準備

根據上一篇的《Redhat7.1安裝Thrift》教程,安裝Thrift開發環境

開發流程

  1. 在Redhat環境,使用Thrift的IDL定義伺服器和客戶端之間的介面。利用Thrift編譯器編譯該IDL檔案,生成語言相關的程式碼框架。
  2. 利用已經生成的程式碼框架,實現客戶端和伺服器的業務邏輯。

C++開發例項

本例環境:Redhat7.1 + Xshell

  1. 定義介面

建立一個專案資料夾

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;
  }
  1. 建立一個入口檔案
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;
}
  1. 建立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) $<
  1. 編譯生成可執行程式
# make all
  1. 執行可執行程式
#./ICale_server
#./ICale_Main

//顯示以下結果
# 3

文章引用與參考

【1】https://blog.csdn.net/u011304970/article/details/73298337/