一、Apache Thrift是什么?
Thrift是一个轻量级、跨语言的远程服务调用(Remote Procedure Call)框架。它通过自身的IDL中间语言, 并借助代码生成引擎生成各种主流语言的RPC服务端/客户端模板代码。
二、软件栈
传输层
传输层负责直接从网络中读取和写入数据,它定义了具体的网络传输协议;比如说TCP/IP传输等。
协议层
协议层定义了数据传输格式,负责网络传输数据的序列化和反序列化;比如说JSON、XML、二进制数据等。
处理层
处理层是由具体的IDL(接口描述语言)生成的,封装了具体的底层网络传输和序列化方式,并委托给用户实现的Handler进行处理。
服务层
整合上述组件,提供具体的网络线程/IO服务模型,形成最终的服务。
三、特性
开发简单
只需要编写IDL文件,再使用自动编译器即可生成服务端和客户端文件,即client、server stub可以自动生成服务端:只需要关注业务逻辑,在IDL对应的方法下实现类(业务逻辑)即可
客户端:只需要像调用本地类方法一样,调用远程服务即可
接口维护简单
只需要修改IDL文件即可对接口进行修改、扩展
学习成本低
像编写面向对象的本地方法一样编写远程服务接口
多语言、跨语言支持
稳定/广泛使用
国内小米、百度、字节、美团都在使用thrift框架
四、数据类型
基本类型
string: utf8格式字符串
bool:布尔
i16:16位有符号整数
i32:32位有符号整数
i64:64位有符号整数
double:64位浮点数
binary: 二进制串
结构体类型
struct
struct person {
1:i64 id,
2:string name,
3:string gender,
4:optional string job=''
}
容器类型
list: 有序元素列表set: 无序无重复元素集合map: 有序的key/value集合
异常类型
exception: 异常类型
服务类型
service: 服务类型
五、传输协议
Thrift可以让用户(服务端定义传输协议)选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本(text)和二进制(binary)传输协议。为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目/产品中的实际需求。常用协议有以下几种:
TBinaryProtocol:二进制编码格式进行数据传输TCompactProtocol:高效率的、密集的二进制编码格式进行数据传输TJSONProtocol: 使用JSON文本的数据编码协议进行数据传输TSimpleJSONProtocol:只提供JSON只写的协议,适用于通过脚本语言解析
六、传输层类型
TSocket:使用阻塞式I/O进行传输,是最常见的模式TNonblockingTransport:使用非阻塞方式,用于构建异步客户端TFramedTransport:使用非阻塞方式,按块的大小进行传输,类似于Java中的NIO
七、服务层类型
TSimpleServer:单线程服务器端,使用标准的阻塞式I/OTThreadPoolServer:多线程服务器端,使用标准的阻塞式I/OTNonblockingServer:单线程服务器端,使用非阻塞式I/OTHsHaServer:半同步半异步服务器端,基于非阻塞式IO读写和多线程工作任务处理TThreadedSelectorServer:多线程选择器服务器端,对THsHaServer在异步IO模型上进行增强
总结
Thrift的基本概念和使用方式