简介
The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.
Thrift
- 你通过Thrift脚本文件生成的代码
- 图中褐色部分是你根据生成代码构建的客户端和服务器的代码
- 红色的部分是两端产生的技术结果。
协议
Thrift可以让你选择客户端与服务器之间的传输通信协议的类别,在传输协议上总体上划分为文本(text)和二进制(binary)传输协议,为节省带宽,提供传输效率,一般情况下使用二进制类型的传输协议为多数,但有时候还是会使用基于文本类型的协议,这些需要根据项目/产品中的实际需求:
- TBinaryProtocol: 二进制编码格式进行数据传输
- TCompactProtocol: 这种协议非常有效,使用Variable-Length Quantity(VLQ)编码对书籍进行压缩。
- TJSONProtocol: 使用JSON的数据编码进行数据传输。
- TSimpleJSONProtocol: 这种协议只提供JSON只写的协议,适用于通过脚本语言解析。
- TDebugProtocol: 在开发的过程中帮助开发人员调试使用,以文本的形式展现方便阅读。
传输层
- TSocket: 使用阻塞式I/O进行传输,也是最常见的模式
- TFramedTransport: 使用非阻塞方式,按块的大小进行传输,类似于Java中的NIO。
- TFileTransport: 顾名思义按照文件的方式进行传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
- TmemoryTransport: 使用内存I/O,就好比Java中的ByteArrayOuputStream实现。
- TZibTransport: 使用只写zlib压缩,不提供Java的实现。
服务端类型
- TSimpleServer: 单线程服务器端使用的标准的阻塞式I/O
- TThreadPoolServer: 多线程服务器端使用标准的阻塞式I/O。
- TNonblockingServer: 多线程服务器端使用的非阻塞式I/O,并实现了Java中的NIO通道。
gunicorn_thrift
实际使用
1 | /srv/tls/venv/bin/gunicorn_thrift tls.gateway.thrift:app -k thriftpy_gevent -b %(ENV_LAN_IP)s:8088 --thrift-protocol-factory thriftpy.protocol:TCyBinaryProtocolFactory --thrift-transport-factory thriftpy.transport:TCyBufferedTransportFactory -w 1 |