一、Thrift介绍
Thrift
是一个轻量级、跨语言的远程服务调用框架,最初由Facebook
开发,后面进入Apache
开源项目。主要包含三大部分:代码生成、序列化框架、RPC框架,相当于protoc + protobuffer + grpc,并且支持大量语言(C++
、Go、Java
、Python
、PHP
、Ruby
等),是一套全栈式的RPC解决方案。整体架构图:![](https://img2020.cnblogs.com/blog/1477786/202108/1477786-20210801222750609-620150662.png)
二、Thrift的数据类型及IDL语法
thrift支持数据类型
基本类型:
- bool: 布尔值
- byte: 8位有符号整数
- i16: 16位有符号整数
- i32: 32位有符号整数
- i64: 64位有符号整数
- double: 64位浮点数
- string: UTF-8编码的字符串
- binary: 二进制串
结构体类型:
- struct: 定义的结构体对象
容器类型:
- list: 有序元素列表
- set: 无序无重复元素集合
- map: 有序的key/value集合
异常类型:
- exception: 异常类型
服务类型:
- service: 具体对应服务的类
除此之外,Thrift 还支持枚举类型(enum)和常量类型(const)
IDL语法参考:
三、通讯协议及序列化协议
Thrift
可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本(text
)和二进制(binary
)传输协议,主要有BinaryProtocol、CompactProtocol、JsonProtocol、MultiplexedProtocol,一般实现RPC最常用协议BinaryProtocol和CompactProtocol。常用协议有以下几种:
- TBinaryProtocol:二进制编码格式进行数据传输
- TCompactProtocol:高效率的、密集的二进制编码格式进行数据传输
- TJSONProtocol: 使用
JSON
文本的数据编码协议进行数据传输 - TSimpleJSONProtocol:只提供
JSON
只写的协议,适用于通过脚本语言解析
上面是RPC通讯协议,序列化协议Thrift实现主要是Binary、Compact、JSON,可以理解通讯协议里面包含了序列化协议。
四、Thrift 网络栈
Thrift 网络栈主要包含四部分:
- Server
- 创建 transport
- 为 transport 创建一个输入/输出 protocol
- 基于 输入/输出 protocol 创建一个 processor
- 等待连接并处理
- Processor
- 从输入流读取数据并写到输出流
- Protocol
- 协议层可以理解为主要负责序列化和反序列化,是与 Proto Buf 可类比的层
- 常用的有 binary、compact:
- Transport
- 通常使用基于 Raw TCP 的传输协议,包括 Buffered 和 Framed 的;
- 一般包含打开链接、关闭链接、读写数据、监听链接等接口和功能;