Thrift 学习笔记–概念介绍

Thirft框架有几个比较重要的组成部分,这里简单介绍以下,主要翻译了其官方文档。加入了自己的一些理解。

网络栈

+——————————————-+
| Server                                    |
| (single-threaded, event-driven etc)       |  Server模型,是单线程,线程组,阻塞非阻塞等
+——————————————-+
| Processor                                 |
| (compiler generated)                      | 处理器,要继承thrift根据idl描述文件生成的代码,进行实际处理方法的实现
+——————————————-+
| Protocol                                  |       协议选择协议这块主要分文本协议和二进制协议,文本协议如json
| (JSON, compact etc)                       |二进制协议有base64,纯二进制,采用zigzag编码的压缩二进制
+——————————————-+
| Transport                                 |
| (raw TCP, HTTP etc)                       | 传输协议层,使用简单scoket,http协议,ftp协议等
+——————————————-+

传输层

传输层提供了一个对网络进行读写操作的抽象,这样可以使得Thrift和底层的传输相隔离,也就使得底层的传输协议可以随意更换,下面是transport暴露出来的一些接口方法:

open

close
read
write
flush
除了上面的传输层接口,Thift还使用了一个ServerTransport的接口,用作接受或者创建原传输对象,主要用在serer对新来的链接请求创建传输对象。接口如下:

open
listen
accept
close

协议层

协议层主要是抽象定义了一些对数据序列化和反序列化的方法,以达到对上层使用的的方便和下层传输的方便,比如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支持的主要协议有:
二进制协议:就是简单的二进制编码,把字段的长度和类型也编成比特字节跟放在字段值前
压缩二进制协议:使用了zigzag的编码方式对整数进行了进一步压缩。
json协议:这个就不多说了,简单的文本协议,相对xml有较高的压缩又不失可读性。

处理层

一个处理器主要是按照指定的协议读取和输出数据到底层传输流,处理器接口是非常简单的。

interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
服务端的处理器是由Thrift命令根据idl描述文件生成的,它已经实现了根据协议对底层数据的访问,
但是在实际使用的时候我们会继承生成方法来具体实现每一个rpc请求方法。

服务层

其实服务层就是把上面所说的协议层,传输层和处理器拢到一起,把他们和服务模式组装起来。

主要有以下一些操作

创建一个传输兑现

给这个传输对象创建输入输出的协议

创建基于输入输出协议的处理器

然后选择一种链接服务模式,等待链接请求的到来,请求来之后会把请求给传输层把数据一直传到处理器,处理器处理完成之后,调用相应的协议再输出到传输层,直到写入请求链路。