简介

thrift 原来是facebook的rpc框架,根据数据结构和接口描述生成多种语言的接口,方便使用多种语言进行开发,详细信息这里不再赘述,下文以一个简单的代码(C++)示例来介绍使用方法。

示例使用的版本信息:

thrift:0.10.0

boost:1.61.0

Qt:MinGW5.5.1

thrift数据结构

不同的语言的数据结构大体相同,但是也有细微的区别,不能通用,thrift使用自己特有的语法描述需要接口,使用指定工具生成对应语言的接口。

thrift的数据结构如下:

//基本类型
bool:布尔型,4位
byte:带符号整数,8位
i16 :带符号整数,18位
i32 :带符号整数,32位
i64 :带符号整数,64位
double:64位浮点型
string:UTF-8编码的字符串
//特殊类型
binary:未经编码的字节流
//结构体
struct:公共对象,不能继承
struct test{
1: string name
}
//枚举
enum test{
OK = 0,
Fail = 1
}
//容器
list<T>: 有序列表
set<T>: 无需集合
map<T, K>: 映射数据
//异常类型
exception:
//服务类型
service:对应服务的类

使用简介

1、编写thrift脚本

thrift脚本用于描述接口

//文件名:test.thrift
//请求数据结构
struct SendData{
1: i32 id,
2: string message
}
//返回数据结构
struct RespondData{
1:string message
}
//收发服务类名Service和接口RespondData
service Service{
RespondData dataSend(1: SendData s),
}

2、编译脚本

使用thrift工具编译脚本

./thrift-0.10.0.exe -r --gen cpp test.thrift

完成后,在目录下生成 gen-cpp 目录,生成的指定语言的接口代码,其中,xxx_server.skeleton.cpp 中为程序入口。

3、在工程中使用thrift

为了方便跨平台,使用Qt框架。

(1)服务端

新建工程,将生成的所有文件加到工程中

此时构建一定失败的,尤其是一大推的 文件不存在 或者 undefined reference to 错误:

  1. 使用 thrift 必须会用到其依赖的 boost,使用相同的编译器编译 boost,将头文件和库文件加到工程中(boost具体该如何编译,请自行参考相关文章);
  2. 将用到的 thrift 的文件加到工程中,注意不需要全部(thrift的依赖库不仅仅是boost,还有其他的,如libevent/openssl等,但不是必须的,用不到的功能可以不用添加,省事);

编译完成后,服务端基本完成,修改接口方法:

我们设定的接口方法 dataSend,找到对应的接口(一般在main函数上面),修改

void dataSend(RespondData& _return, const SendData& s) {
// Your implementation goes here
printf("Receive data: %d, %s\n", s.id, s.message.c_str());//打印客户端的传入参数
_return.message = "This is respond message";//返回给客户端的数据
}

主入口代码不变:

int main(int argc, char **argv) {
int port = 9090;//服务端监听的端口
shared_ptr<ServiceHandler> handler(new ServiceHandler());
shared_ptr<TProcessor> processor(new ServiceProcessor(handler));
shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); //创建server,这样会单线程执行,同一时间只能接收一次请求,可以使用多线程
TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
server.serve();
return 0;
}

(2)客户端

新建工程,将接口代码添加到项目中,除了 xxx_server.skeleton.cpp,这里面是服务端的代码

添加代码和相应的类库,和服务端类似

#include "gen-cpp/Service.h"
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TBinaryProtocol.h>
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport; using boost::shared_ptr; int main(int argc, char **argv) {
//创建socket,接口要和服务端一致,thrift本质上还是socket,这里使用socket短链接
boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
//传输协议
boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
transport->open();//开始传输,最后要关闭 //发送数据结构
SendData send_data;
send_data.__set_id(12345);
send_data.__set_message("This is test message");
ServiceClient client(protocol);//创建客户端 //响应数据结构
RespondData respond_data;
client.dataSend(respond_data, send_data);//开始交互
printf("Respond:%s", respond_data.message.c_str()); transport->close();
return 0;
}

(3)运行

最后,运行结果如下

服务端:

客户端:

自此,使用 thrift 完成一次数据交互,从代码中可以看到,客户端/服务端像调用函数一样进行数据交互,这就是RPC的方便所在。

错误集锦

windows下没有PosixThreadFactory类,可以使用BoostThreadFactory代替![]

thrift的使用的更多相关文章

  1. 和 Thrift 的一场美丽邂逅

    一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...

  2. Apache thrift RPC 双向通信

    在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...

  3. common-pool2 学习:thrift连接池的另一种实现

    对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造轮子,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...

  4. thrift:swift项目笔记

    先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...

  5. dubbo/dubbox 增加原生thrift及avro支持

    (facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...

  6. Thrift的TJsonProtocol协议分析

    Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原 ...

  7. Thrift的TBinaryProtocol二进制协议分析

    先上张图,说明一下thrift的二进制协议是什么东东. 报文格式编码: bool类型: 一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0). Byte类型: 一个字节的类 ...

  8. 高可用thrift客户池的实现详解

    最近,公司要求将组内的thrift客户端组件推广至公司内使用.基本的要求如下: 1.高可用 2.集成名称服务,也就配置文件支持服务发现 3.解耦,客户端和高可用组件解耦,简单来说就是,如果以后要切换其 ...

  9. 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world

    2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...

  10. thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)

    关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1)                 Linux下环境配置 ...

随机推荐

  1. Python语言-selenium webdriver操作记录汇总

    1.控制浏览器大小 set_window_size() 设置浏览器大小 该方法有两个参数,第一个参数是宽,第二个是高 maximize_window() 设置浏览器全屏显示,无参数 chrome谷歌浏 ...

  2. python批量爬取动漫免费看!!

    实现效果 运行环境 IDE VS2019 Python3.7 Chrome.ChromeDriver Chrome和ChromeDriver的版本需要相互对应 先上代码,代码非常简短,包含空行也才50 ...

  3. 定位new表达式与显式调用析构函数

    C++的核心理念之一是RAII,Resource Acquisition Is Initialization,资源获取即初始化.资源有很多种,内存.互斥锁.文件.套接字等:RAII可以用来实现一种与作 ...

  4. Daily Scrum 12/21/2015

    Process: Zhaoyang: Integrate the oxford Speech API Code to the IOS client and do some UI optimizatio ...

  5. vue2.x学习笔记(一)

    使用vue开发项目已经过了一段时间了,对其中的很多东西还是一知半解,于是想要系统学习一下.主要内容是参照官方中文网站https://cn.vuejs.org/v2/guide/,然后加上一些自己的理解 ...

  6. Python 代码编辑器怎么选?PyCharm、VS Code、Jupyter Notebook 都各有特色

    Python 代码编辑器怎么选?PyCharm.VS Code.Jupyter Notebook 都各有特色,Jupyter 适合做数据分析这些需要可视化的操作,PyCharm 更适合做完整的 Pyt ...

  7. ISWC 2018概览:知识图谱与机器学习

    语义网的愿景活跃且良好,广泛应用于行业 语义网的愿景是「对计算机有意义」的数据网络(正如 Tim Berners Lee.James Hendler 和 Ora Lassila 在<科学美国人& ...

  8. 即时通信WebSocket 和Socket.IO

    WebSocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯. 在2008年诞生,2011年成为国际标准. 现在基本所有浏览器都已经支持了. We ...

  9. Java 多线程实现方式三:实现 Callable 接口

    完整套路 java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值. 基本套路: 1. 创建目标对象 2. 创建执 ...

  10. Selenium常见报错问题(3)- 解决和分析NoSuchElementException

    如果你在跑selenium脚本时,需要某些异常不知道怎么解决时,可以看看这一系列的文章,看看有没有你需要的答案 https://www.cnblogs.com/poloyy/category/1749 ...