Thrift 网络栈
下图是一个Thrift网络栈的简单描述
+-------------------------------------------+
| 服务器层 |
| (单线程由消息驱动) |
+-------------------------------------------+
| 处理层 |
| (由编译器自动生成的) |
+-------------------------------------------+
| 协议层 |
| (JSON格式可压缩) |
+-------------------------------------------+
| 传输层 |
| (TCP、HTTP协议) |
+-------------------------------------------+
传输层(Transport)
传输层提供了面向网络IO的一个简单抽象。这保证了Thrift能够将底层传输和系统其他功能(例如序列化和反序列化等)解耦。
以下是一些Transport接口支持的方法:
- open
- close
- read
- write
- flush
除了上面提及的Transport接口,Thrift还提供了可用于接收和创建基本Transport对象的ServerTransport接口。正如它名字所示,ServerTransport主要用于服务端接受请求。
以下是ServerTransport接口支持的方法:
- open
- listen
- accept
- close
以下是在绝大部分Thrift支持的语言中可供使用的基础Transport类型:
- file: 从磁盘中文件读取或者写入到文件中
- http: http链接
协议层(Protocol)
协议层抽象定义了内存中数据到传输格式的映射机制。换句话说,协议定义了数据如何使用底层Transport对象来编码和解码。因此Protocol实现中定义了编码模式并负责序列化/反序列化。Protocol实现的例子包括JSON,XML,纯文本,压缩二进制等等。
以下是Protocol接口包含的一些函数:
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的Protocol是面向流设计的,因此没有必要去显式分帧(framing)。比如,在开始序列化之前我们可以不用关心我们传输的字符串长度或者列表中元素的个数。在Thrift支持的大部分编程语言中可供使用的Protocol类型有:
- binary:简单二进制编码–字段长度和类型被编码成二进制并紧跟在实际字段值后面
- compat: 详情见THRIFT-110
- json
处理层(Processor)
Processor封装了从输入流读取数据和从输出流写数据的能力。 上一个部分描述的Protocol对象代表了输入流和输出流。Processor接口非常简单。
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
Processor实现由编译器自动生成。从原理上,Processor通过输入Protocol从网路上读取数据,并将数据处理代理给用户实现的Handler,并最终通过输出Protocol将数据写回到网路上。
服务器层(Server)
一个服务器将所有上述的组件合并到一起并按照下列流程工作:
- 创建一个Transport对象
- 在Transport基础上创建输入/输出Protocol对象
- 在输入/输出Protocol基础上创建Processor对象
- 监听到来的连接并移交给Processor处理
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/93874.html