1. 简介
Apache Thrift传输库将Apache Thrift的上层与设备特定的细节隔离开来。使协议能够在不了解底层设备的情况下读取和写入字节流。这样可以支持新设备和中间件系统在不影响软件上层的情况下添加到平台中。
例如,假设已经开发了一套程序来通过Sockets网络API进行通信。部署应用程序后,需求扩大,并要求添加对AMQP消息传递系统传输的支持。如果在底层I / O层和代码上层之间定义了清晰的接口,则扩展的功能将非常容易实现。新的AMQP代码可以简单地实现现有的I / O接口,允许上层代码使用Socket解决方案或AMQP解决方案而不必知道两者之间的区别。
Apache Thrift传输层提供了这种抽象。传输的模块化性质允许在编译时或运行时选择和更改传输,从而为应用程序提供对一系列设备的插件支持。
2. 传输接口
Apache Thrift传输层向上层代码公开了一个简单的面向字节的I / O接口。
此接口通常在称为TTransport的抽象基类中定义。以下为几个常用的方法:
open() I/O操作相关的传输 close() 关闭传输 isOpen() 判断是否开启传输功能 read() 读取字节 readAll() 读取传输过程中确切数目的字节 write() 将字节写入传输过程(传输可能会有缓冲操作) flush() 强制将所有缓冲的字节写入基础设备
3. 端点传输
我们将写到物理或逻辑设备的Apache Thrift传输称为“端点传输”。端点传输始终位于Apache Thrift的下层,传输堆栈和几乎所有Apache Thrift I / O操作都只需要一个端点传输。如下所示:
大多数Apache Thrift语言都至少提供了关于内存,文件和网络设备的端点传输。
- 面向存储器的传输,例如TMemoryBuffer,通常用于收集多个小的写操作,这些写操作随后作为单个块发送。
- 基于文件的传输(例如TSimpleFileTransport)通常用于日志记录和状态持久性。
- 最重要的Apache Thrift传输类型是用于支持RPC的网络传输。
- 最常用的Apache Thrift网络传输是TSocket。TSocket传输使用Socket API通过TCP / IP传输字节。
- 其他设备和网络协议也可以通过传输接口公开。例如,C ++,Java和Python传输库提供Http类,以使用HTTP协议进行读写。
- 可以为不受支持的网络协议或设备构建自定义传输,这样做可以使整个框架在新的端点类型上运行。
4. 分层传输
由于Apache Thrift传输是由通用TTransport接口定义的,因此客户端代码独立于基础传输实现。这意味着传输可以覆盖任何内容,甚至可以覆盖其他传输。
通过对传输进行分层,Apache Thrift允许将通用传输行为分为可互操作和可重用的组件。
例如:假如正在构建一个银行应用程序,该应用程序调用由另一家公司托管的服务。您需要加密在客户端和RPC服务器之间传输的所有字节。如果创建了分层传输来提供加密,则客户端和服务器代码可以简单地在原始网络传输之上使用新的加密层。
将此加密功能构建到分层传输中的好处有很多,其中最重要的一点是可以将其插入现有的客户端代码和旧的网络传输之间,而不会产生任何影响。客户端代码会将加密传输层视为另一个传输。网络端点传输会将加密传输视为另一个客户端。
此外,加密传输可以在任何端点传输的基础上进行分层,从而使您可以对网络I / O以及文件I / O和内存I / O进行加密。分层方法允许将加密问题与设备I / O问题分开。
不是端点传输的所有Apache Thrift传输称为“分层传输”。分层传输公开了标准的Apache Thrift TTransport与客户端的接口,并取决于下面层的TTransport接口。这样,可以使用多个传输层来形成一个传输堆栈,如上图所示。
常用的Apache Thrift分层传输是成帧传输。在大多数语言库中,此传输称为TFramedTransport,它为每个Apache Thrift消息添加四字节消息大小作为前缀。这样可以在某些情况下更有效地处理消息,允许接收器读取帧大小,然后提供帧所需的确切大小的缓冲区。
注:客户端和服务器必须使用兼容的传输堆栈进行通信。例如:如果服务器使用的是TSocket传输,则客户端将需要使用TSocket传输。
分层传输提供的另一个重要功能是缓冲。TFramedTransport隐式缓冲写入操作,直到调用flush()方法为止,此时将帧大小和数据写入下面的层。
在许多I / O场景中,写缓冲都可以提高性能。例如,协议在序列化期间进行许多小的写操作,在网络情况下,这可能会导致传输许多小的数据包,从而造成不必要的系统开销。缓冲允许整个RPC消息作为一个单元发送。TBufferedTransport是TFramedTransport的替代,它可以在不需要成帧时提供缓冲。
某些语言将缓冲内置到端点解决方案中,并且不提供TBufferedTransport(例如Java)。
5. 服务端传输
当两个进程通过网络连接通信时,服务器必须侦听客户端的连接,并在客户端到达时接受新的连接。服务器连接的抽象接口通常称为TServerTransport。TServerTransport最受欢迎的实现是用于TCP / IP网络的TServerSocket。服务器传输将每个新连接连接到TTransport实现,以处理单个连接的I / O。
服务端传输的方法
服务器传输通常有四种方法。 listen()和close()方法准备使用服务器传输,并分别将其关闭。客户端无法在调用listen()之前进行连接。accept()方法将阻塞,直到客户端连接到达为止。
当客户端启动连接时,服务器的accept()方法将返回连接到该连接的TTransport,然后该TTransport用于支持客户端的常规RPC操作。interrupt()方法使服务器传输停止阻塞的调用,直接返回。
今天就到这里,欢迎多多交流~