Thrift network stack
本文翻译自Thrift network stack
Apache Thrift网络栈的简要描述
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
传输
传输层提供了读写网络的简单抽象。这使得Thrift可以与系统的底层传输解耦(如序列化/反序列化)。
下面是传输层接口暴露的一些方法:
- open
- close
- read
- write
- flush
除了上面的传输接口外,Thrift还使用ServerTransport
接口来接受或创建原始的传输对象。正如名字所写的,服务器端端使用ServerTransport
为到来的连接创建一个传输对象(Transport objects)。
- open
- listen
- accept
- close
大多数支持Thrift支持的语言的可选的一些传输如下:
- file: read/write to/from a file on disk
- http: as the name suggests
###协议
协议的抽象定义了将内存中结构映射为有线格式(wire-format)的机制。换句话说,协议指明了数据如何使用底层的传输来进行编解码。因此协议实现控制了编码格式,并负责序列化和反序列化。协议举例,如JSON,XML,plain text, compact binary 。
下面是协议接口:
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语言可选的协议:
- binary:相当简单的二进制编码–字段的长度和类型都编码为字节
- compact:在THRIFT-100中描述
- json
###处理器(Processor)
一个处理器有两个能力:从输入流读取数据,将数据写入到输出流。协议对象(protocal objects)代表输入流和输出流。处理器接口可以非常简单:
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
特定服务处理器(service-specific)的实现是由compiler生成的。本质上处理器processor使用输入协议从wire读取数据,将处理过程委托给用户自己实现的handler,然后使用输出协议将数据写入wire。
服务
一个server将上面描述的所有的不同的特性聚合在一起:
- 创建一个传输 transport
- 为传输创建一个input/output协议
- 基于Input/output协议创建一个处理器processor
- 等待输入连接,并将其交给processor