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 $@ $^ -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) $<
- 编译生成可执行程序
# make all
- 运行可执行程序
#./ICale_server
#./ICale_Main
//显示以下结果
# 3
文章引用与参考
【1】https://blog.csdn.net/u011304970/article/details/73298337/