Thrift 网络栈
Apache Thrift 网络栈的简单表示
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
传输层 Transport
传输层为从网络读取/写入提供了一个简单的抽象。这使得 Thrift 能够将底层传输与系统的其他部分分离(例如:序列化/反序列化)。
以下是传输层接口暴露的一些方法:
- open
- close
- read
- write
- flush
除上述传输接口外,Thrift还使用 ServerTransport 接口来接受或创建原始传输对象。顾名思义,ServerTransport 主要用于服务器端,为进来的连接创建新的传输对象。
- open
- listen
- accept
- close
以下是在 Thrift 支持的语言中,绝大多数均可用的一些传输:
- file:读取/写入磁盘上的文件
- http:顾名思义
协议 Protocol
对协议的抽象定义了一种将内存数据结构映射为线上传输格式的机制。换句话说,一个协议指定了数据类型如何使用底层传输来对自己进行编码/解码。因此,协议的实现决定编码方案并负责(反)序列化。在这个意义上,一些常见协议的例子包括 JSON、XML、纯文本、紧凑的二进制文件等。
下面是 协议 的接口:
writeMessageBegin(name, type, seq)
writeMessageEnd()
writeStructBegin(name)
writeStructEnd()
writeFieldBegin(name, type, id)
writeFieldEnd()
writeFieldStop()
writeMapBegin(ktype, vtype, size)
writeMapEnd()
writeListBegin(etype, size)
writeListEnd()
writeSetBegin(etype, size)
writeSetEnd()
writeBool(bool)
writeByte(byte)
writeI16(i16)
writeI32(i32)
writeI64(i64)
writeDouble(double)
writeString(string)
name, type, seq = readMessageBegin()
readMessageEnd()
name = readStructBegin()
readStructEnd()
name, type, id = readFieldBegin()
readFieldEnd()
k, v, size = readMapBegin()
readMapEnd()
etype, size = readListBegin()
readListEnd()
etype, size = readSetBegin()
readSetEnd()
bool = readBool()
byte = readByte()
i16 = readI16()
i32 = readI32()
i64 = readI64()
double = readDouble()
string = readString()
Thrift 协议是面向流而设计的。不需要任何显式的组帧操作。例如,在我们开始序列化它们之前,不需要知道字符串的长度或列表中的元素的个数。一些 Thrift 支持的语言可用的协议有:
- 二进制:相当简单的二进制编码 – 字段的长度和类型被编码为字节,然后是字段的实际值。
- 紧凑式:在THRIFT-110中描述
- JSON
处理器 Processor
处理器封装了从输入流中读取数据并写入输出流的能力。输入和输出流由协议对象表示。处理器接口非常简单
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
服务特定的处理器实现由编译器生成。处理器本质上是从线路上读取数据(使用输入协议),将处理委托给处理程序(由用户实现),并在线路上(使用输出协议)写入响应。
服务器 Server
服务器将上述所有各种功能汇集在一起:
- 创建传输对象
- 为传输对象创建输入/输出协议
- 根据输入/输出协议创建处理器
- 等待传入连接并将它们交给处理器