1 概念
Thrift的网络堆主要有4部分组成,分别是Transport、Protocol、Processor、Server,下图是thrift网络堆的层次图:
2 传输层(Transport)
传输层为网络的读写提供了一个简单抽象的接口,使得thrift的传输从系统底层摆脱出来(例如:序列化和反序列化)。
下列是传输层开放的接口:
· open
· close
· read
· write
· flush
除了上面的传输接口,Thrift经常使用ServerTransport接口去接受或者创建一个原始的传输对象。就如名字的定义一样,ServerTransport 主要用在服务端为请求的连接创建传输对象。
· open
· listen
· accept
· close
下列是可用的传输方式:
· 文件
· http
3 协议层(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的协议层被设计成面向流,不需要任何明确的结构说明。例如,在我们序列化它们之前不需要知道有多长的字符串或者有多少个字段。
下列是可用的协议方式:
· binary:相当简单的二进制编码—按字段的类型的字节长度编码实际的值
· compact:压缩
· json
4 处理器层(Processor)
处理器层封装了从输入流读取数据和将数据写入输出流,处理层接受的输入流和输出流就是协议层的对象。
interfaceTProcessor{
bool process(TProtocol in, TProtocol out)throws TException
}
特定服务的处理器层是由脚本代码生成,处理器层使用输入协议对象从总线读取数据,然后触发处理函数(由开发者编写)处理数据,再将处理结果使用输出协议对象写回总线。
5 服务器层(Server)
一个服务器汇集所有下列的各种功能:
· 创建传输对象
· 为传输对象创建输入\输出协议对象
· 在输入\输出协议对象的基础上创建处理器对象
· 等待请求连接,然后将数据交给处理器对象处理