| 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请求方法。
服务层
其实服务层就是把上面所说的协议层,传输层和处理器拢到一起,把他们和服务模式组装起来。
主要有以下一些操作
创建一个传输兑现
给这个传输对象创建输入输出的协议
创建基于输入输出协议的处理器
然后选择一种链接服务模式,等待链接请求的到来,请求来之后会把请求给传输层把数据一直传到处理器,处理器处理完成之后,调用相应的协议再输出到传输层,直到写入请求链路。
关注「黑光技术」,关注大数据+微服务