1. 简介
在Apache Thrift的上下文中,协议是用于序列化类型的方法。Apache Thrift RPC不支持每种语言定义的每种类型。相反,Apache Thrift类型系统包括大多数语言(int,double,string,等等),以及一些使用率高且得到广泛支持的容器类型(地图,集合,列表)。所有协议都必须能够读取和写入Apache Thrift类型系统中的所有类型。
2. 分类
Apache Thrift提供了几种序列化协议,每种都有其自己的目标:
- 二进制协议–简单快速
- 紧凑协议–有较小的数据大小,没有过多的开销
- JSON协议–标准和广泛的互操作性
二进制协议是默认的Apache Thrift协议,Thrift最初发布时是唯一提供的协议。二进制协议需要最少的CPU开销,本质上是按照字节顺序将所需的类型写入字节流。
紧凑协议旨在最大程度地减少数据的序列化表示。紧凑协议相当简单,但是在将位压缩的过程中使用了更多的CPU。在I / O瓶颈和CPU充足的情况下,是一个不错的协议。
JSON协议将输入转换为JSON格式的文本。在三种常用的Apache Thrift协议中,JSON可能会消耗更多的资源。JSON的优点是广泛的互操作性和可读性。
3. 接口
Apache Thrift语言通常提供称为TProtocol的抽象协议接口,该接口定义用于读取和写入每种Apache Thrift类型的方法,以及用于序列化容器,用户定义的类型和消息的组合方法。
Apache Thrift类型系统允许定义结构。Apache Thrift结构是基于IDL的用户定义类型,由一组字段组成。这些字段可以是任何合法的Apache Thrift类型,包括基本类型,容器和其他结构。
Apache Thrift消息是用于通过传输传递RPC调用和响应的封装。协议接口提供对序列化结构和消息的支持。
下面列出了一些定义Apache Thrift类型系统的典型TProtocol方法。此处列出的每个写入方法都有一个具有相同后缀的对应读取方法(例如writeBool()/ readBool())。
4. IDL示例
Apache Thrift IDL是一种接口定义语言,旨在简单明了的描述应用程序类型和服务接口且与语言无关。Apache Thrift IDL编译器读取IDL文件并以多种语言输出序列化代码和RPC存根。
下面是一个定义的例子:
struct Date { #A 1: i16 year, 2: i16 month, 3: i16 day, } service HalibutTracking { #B i32 GetCatchInPoundsToday(), i32 GetCatchInPoundsByDate(1: Date d, 2: double t), #C }
释义如下:
#A Date是Apache Thrift用户定义的类型,为此将生成读/写序列化代码类型 #B HalibutTracking是Apache Thrift服务接口,将为此接口生成客户端和服务器RPC存根 #C 用户定义的类型Date可用作参数或返回类型
上面的IDL文件中定义的服务称为HalibutTracking。 此服务取决于用户定义的类型Date 。要将IDL编译为特定语言的代码,要使用指示目标语言的开关调用IDL编译器以生成代码。处理方式如下:
例如:命令“ thrift –gen java halibut.thrift”将输出一组Java文件,这些文件使用HalibutTracking服务启用日期类型和客户端/服务器RPC的序列化。其他语言的过程与此类似。
今天的日常~~