聊聊Thrift(一) 基础
什么是Thrift
Thrift——Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。
Thirft采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。
Thrift架构
thrift架构图见下:
图中黄色部分是用户实现的业务逻辑,褐色部分是根据 Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架,红色部分是根据 Thrift 文件生成代码实现数据的读写操作。红色部分以下是 Thrift 的传输体系、协议以及底层 I/O 通信,使用 Thrift 可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重新生成代码。
Thrift数据类型
基本类型
bool:布尔值,true 或 false,对应 Java 的 boolean
byte:8 位有符号整数,对应 Java 的 byte
i16:16 位有符号整数,对应 Java 的 short
i32:32 位有符号整数,对应 Java 的 int
i64:64 位有符号整数,对应 Java 的 long
double:64 位浮点数,对应 Java 的 double
string:未知编码文本或二进制字符串,对应 Java 的 String结构体类型
struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean- 容器类型
list:对应 Java 的 ArrayList
set:对应 Java 的 HashSet
map:对应 Java 的 HashMap - 异常类型
exception:对应 Java 的 Exception - 服务类型
service:对应服务的类
Thrift协议
Thrift 可以让用户选择客户端与服务端之间传输通信协议的类别,在传输协议上总体划分为文本 (text) 和二进制 (binary) 传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议为多数,有时还会使用基于文本类型的协议,这需要根据项目 / 产品中的实际需求。常用协议有以下几种:
- TBinaryProtocol —— 二进制编码格式进行数据传输
- TCompactProtocol —— 高效率的、密集的二进制编码格式进行数据传输
- TJSONProtocol —— 使用 JSON 的数据编码协议进行数据传输
- TSimpleJSONProtocol —— 只提供 JSON 只写的协议,适用于通过脚本语言解析
Thrift传输层
- TSocket —— 使用阻塞式 I/O 进行传输,是最常见的模式
- TNonblockingTransport —— 使用非阻塞方式,用于构建异步客户端
Thrift服务端类型
- TThreadPoolServer 阻塞线程池模式
- TNonblockingServer 非阻塞模式
- TThreadedSelectorServer 非阻塞高级模式
Thrift使用 java版本
- 编写IDL文件,如demo.thrift
- 编写自定义数据类型文件,如thrift.datatype.thrift
- 编译Thrift服务接口文件
- 编写服务器端的java代码,实现thrift服务端的接口
- 编写客户端的java代码,实现RPC调用和业务逻辑
上面为thrift的相关内容,后面会针对3中服务端的模式进行进一步讲解