Thrift 学习笔记--概念介绍

| 2014年1月4日

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请求方法。

服务层

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

主要有以下一些操作

创建一个传输兑现

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

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

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

看完本文有收获?请分享给更多人

关注「黑光技术」,关注大数据+微服务