核心概念
登录后可跨设备保存划线和私人笔记登录
Thrift 网络栈
Apache Thrift 网络栈的简单表示
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+传输层(Transport)
传输层为网络的读写操作提供了一种简单的抽象。这使得 Thrift 能够将底层传输与系统的其余部分(例如序列化/反序列化)解耦。
以下是 Transport 接口所暴露的一些方法:
- open
- close
- read
- write
- flush
除了上述 Transport 接口之外,Thrift 还使用 ServerTransport 接口来接受或创建基础传输对象。顾名思义,ServerTransport 主要用于服务器端,为传入的连接创建新的 Transport 对象。
- open
- listen
- accept
- close
以下是 Thrift 所支持的大多数语言中可用的部分传输方式:
- file:读写磁盘上的文件
- http:顾名思义
协议(Protocol)
协议抽象定义了一种将内存中的数据结构映射为线上格式(wire-format)的机制。换句话说,协议规定了数据类型如何借助底层 Transport 对自己进行编码/解码。因此,协议实现决定了编码方案,并负责(反)序列化。从这个意义上说,协议的例子包括 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 协议在设计上是面向流的,无需任何显式的帧界定。例如,在开始序列化之前,并不需要知道字符串的长度或列表中元素的个数。大多数 Thrift 支持的语言都提供了以下几种协议:
- binary:相当简单的二进制编码——字段的长度和类型以字节形式编码,其后紧跟字段的实际值。
- compact:详见 THRIFT-110
- json
Processor
Processor 封装了从输入流读取数据并向输出流写入数据的能力。输入流和输出流由 Protocol 对象表示。Processor 接口极其简单。
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}服务专属的处理器实现由编译器生成。Processor 的本质是从传输通道读取数据(使用输入协议),将处理工作委托给处理器程序(由用户实现),然后通过传输通道写出响应(使用输出协议)。
服务器
Server 将上述各种功能整合在一起:
- 创建传输层
- 为该传输层创建输入/输出协议
- 基于输入/输出协议创建处理器
- 等待传入的连接,并将其交给处理器处理
评论
登录后参与评论
正在加载评论…
KnowForge