核心概念

师成师成· 更新于 2026-09-28· 阅读 5 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

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 接口之外,Thr​​ift 还使用 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 将上述各种功能整合在一起:

  • 创建传输层
  • 为该传输层创建输入/输出协议
  • 基于输入/输出协议创建处理器
  • 等待传入的连接,并将其交给处理器处理

评论

登录后参与评论

正在加载评论…