一、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/O
- TThreadPoolServer:多线程服务器端,使用标准的阻塞式
I/O
- TNonblockingServer:单线程服务器端,使用非阻塞式
I/O
- THsHaServer:半同步半异步服务器端,基于非阻塞式
IO
读写和多线程工作任务处理 - TThreadedSelectorServer:多线程选择器服务器端,对
THsHaServer
在异步IO
模型上进行增强
总结
Thrift的基本概念和使用方式