简介
Thrift是一个RPC调用框架,因此底层会封装一层传输层,用来帮助构建好的代码进行数据的传输。
其中TTransport封装了传输层,同时他也封装了上层的流。比如他的一个子类:TIOStreamTransport。里面使用的就是我们常用的socket的InputStream和outPutStream
TTransport的设计理念是和我们生成的代码、协议层完全解耦。
- 我们生成的代码(Client)只需要处理读到的数据以及处理,并不需要关心如何去读取这个数据。
- 协议层也只需要进行数据的编解码。但是无需关心这些数据是如何来的,是使用的http还是socket还是file等。
TTransport结构

这个并不是一个完整的传输层,还有一部分是在服务端使用的,用来帮助生成的代码来创建一个默认的TTransport,供给服务端使用。如果不好理解,可以类比Socket和ServerSocket。
TServerTransport结构
分析
TTransport
下面是源码分析,已经对注解翻译,并且去掉了具体实现
|
|
在实现类中,有这么几个比较重要的子类:
- TIOStreamTransport: 这个类封装了InputStream和OutputStream这两个流,用来处理数据传输中的输入输出流。采用的是阻塞同步IO。
- TSocket: 是上面这个类的子类,并且封装了Socket接口。
- TNonblockingTransport: 这个类是非阻塞IO的抽象类。
- TNonblockingSocket: 则是使用了SocketChannel进行了非阻塞IO。
- TFileTransport: 这个类没有仔细研究,里面允许client把文件传输给服务端,同时允许服务端把文件写入到文件。
- TFramedTransport: 帧传输类就是按照一帧的固定大小来传输数据,所有的写操作首先都是在内存中完成的直到调用了flush操作,
然后传输节点在flush操作之后将所有数据根据数据的有效载荷写入数据的长度的二进制块发送出去,允许在接收的另一端按照固定的长度来读取。我司的封装是这里的cv操作。 - TFastFramedTransport: 是快读类,相对于上面的类读取的效率会变的更高。
下面从源码角度分析几个比较重要的类:
CASE:TIOStreamTransport,主要以翻译、删减无用代码尽可能突出主干
|
|
下面是他的唯一子类,TSocket,封装了Socket
|
|
CASE:TNonblockingTransport抽象类 主要以翻译为主
|
|
下面介绍的是他的唯一子类:TNonblockingSocket,需要看到懒加载的位置在哪里,暂时未知,为什么不需要flush呢