所有代码见GitHub:Thrift Demos
第一章 Introduction to Apache Thrift
本章详细介绍了thrift的一些特点,优点,不足,以及简单的Java,Python,C++客户端,服务端Demo,本次阅读主要针对于Java相关的进行学习,C++和Python都是类似的,直接跳过。
优点:跨语言;开发效率高;提供插件序列化协议;性能可观;灵活扩展性好
缺点:不支持自引用型数据结构;大数据量传输不合适;无法提供类MQ功能;对于追求极致性能可能有所欠缺
第二章 Apache Thrift Architecture
本章详细介绍了thrift的垂直分层架构,以及每层的作用。
- RPC Server Library Server层,基于thrift框架封装的RPC服务,thrift提供了许多的IO模型的server
- RPC Service Stubs Service层,根据IDL生成对应的接口,thrift已经封装好了和server的交互,分发过程,开发者只需要重关注业务逻辑接口即可
- User Defined Type Serialization UDT层,根据IDL生成对应的实体类,封装了与协议层交互的序列化方法
- The Serialization Protocol Library Protocol层,定义序列化使用的协议,封装了与传输层的交互的方法
- The Transport Library Transport层,用于端到端网络IO,基于socket进行的封装,再往下就是socket的底层
第三章 Moving Bytes with Transports
本章着重介绍Thrift的第一层传输层,在端到端进行数据传输的在整个Thrift中起到怎样的作用,以及如何独立的进行端到端读写,并且写了一些memory,disk,network的读写Demo,如果之前做过网络编程就很好理解,其实都是一些简易的设备IO编程demo。
第一部分介绍了thrift如何在memory,disk之间通信,主要是使用以下两个类:
TSimpleFileTransport //文件传输使用的类
TMemoryBuffer //创建内存缓存使用的类
第二部分介绍了thrift的transport接口的一些方法,分别从C++,Java,Python角度来介绍,本次着重学习Java相关的,后续同样,不在赘述,TTransport是传输层所有类的公共基类,所有的传输方法都继承此类,Java的TTransport类的一些抽象方法:
public abstract void open() throws TTransportException; //建立一个传输连接
public abstract void close(); //关闭传输连接
public abstract int read() throws TTransportException; //从传输连接读取一定量数据
public int readAll() throws TTransportException; //一次把缓存读取完
public void write() throws TTransportException; //写
public void flush() throws TTransportException; //清空写缓存
public void consumeBuffer(); //消费缓存区,直接删除,相对于read避免了复制的开销
第三部分介绍了使用TTransport进行网络通信,主要的内容就是使用TTransport的子类TSocket进行通信。
第四部分主要介绍了通过TServerTransport构造一个网络服务器,类似于rpc的服务方,然后等待客户端的请求,TServerTransport的方法比较简单可以直接去看源码。
第五部分主要介绍了另外一个很重要的传输类,TFramedTransport,可以在传输的过程中指定本次传输的字节数,方便接收端接受,常用于在传输层中进行多次数据处理。
第六部分是总结,本章着重介绍了thrift的最底层-传输层,是thrift一切的基础,传输层的所有操作由TTransport接口来定义,规范;实现了与设备无关的字节流读写,此外还介绍了分层传输的实现,分层传输主要就是在传输层再细分,从接收到消息之后再进行多次处理。
第四章 Handing Exceptions
本章着重介绍了thrift的异常处理处理模型和机制;使用thrift如何处理传输异常,协议异常,应用异常,返回用户定义的异常;以及作为开发者,如何设计出健壮的异常处理程序。
所有的可能异常都用TException来描述,对应Java中的Exception类,针对不同层的可能出现异常,分别使用TTransportException,TProtocolException,TApplicationException来捕获
此外,允许用户在IDL使用exception关键字中定义异常,实现异常从客户端传递到远程服务端,但是大部分情况异常只需要在客户端处理即可。
本章的主要作用就是简单了解一下thrift的异常处理机制,和不同语言之间的对应关系,方便我们写出更加健壮的代码。
第五章 Serializing Data with Protocols
本章主要介绍了thrift的协议层的作用,thrift协议层主要指定了序列化的方式,并且能够能够做到语言无关性的序列化,比如只要使用方指定了相同的协议,Java序列化的数据,C++也同样可以反序列化使用。thrift主要提供了三种序列化协议,分别是:
- TBinaryProtocol 二进制的序列化协议通过将数据转化为二进制01比特流来存储,是thrift的默认序列化协议,因为大部分的语言都支持这一协议,但是JavaScript不支持,js仅支持json类型的数据。
- TCompactProtocol 紧凑的序列化协议,顾名思义序列化之后的数据很紧凑,所以大小要比binary的更小一些,但是支持的广泛程度不如TBinaryProtocol。
- TJSONProtocol JSON的序列化协议,这种序列化方式的主要优点就是可读性高,前两者序列化之后的数据几乎没有可读性。
所有协议的公共父类都是TProtocol,与TTransport类似,TProtocol的方法很多,但是看名字就能知道是什么意思,使用的时候直接看源码即可,这里就不赘述了。
本章实现了一个C++写,Java