Thrift 入门教程

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 $@ $^ -L$(BASICLIB) $(BASICLIBLINK)
    strip $@

ICale_Main: ICale_Main.o ICale.o
    $(CXX) $(CFLAGS) -o $@ $^ -L$(BASICLIB) $(BASICLIBLINK)
    strip $@
 
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/

猜你喜欢

转载自blog.csdn.net/jerry890130/article/details/85131050