thrift原理分析
Posted 咖啡拿铁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thrift原理分析相关的知识,希望对你有一定的参考价值。
简介
Thrift是一款Facebook开发的rpc框架( remote procedure call),并且已经加入到Apache项目。
Thrift是采用二进制编码协议,使用TCP/IP传输协议的一种RPC实现,而XML-RPC/JSON-RPC/SOAP与WSDL协议栈采用文本协议,WSDL的实现WebService采用HTTP作为传输协议,对于网络数据传输,TCP/IP协议的性能要高于HTTP协议,不仅因为HTTP协议是应用层协议,HTTP协议传输内容除了应用数据本身之外,还有响应状态码、Header信息等。
RPC介绍
可以用一张图体现:
Thrift工作流程
设计所需要的服务
根据设计的服务,编写Thrift IDL服务描述文件
根据编写的Thrift IDL服务描述文件使用Thrift提供的代码生成工具生成服务端与客户端的代码
实现服务端业务逻辑的编写,同时实现客户端调用代码的编写
运行服务端与客户端
Thrift内部运行
Thrift运行时的网络堆栈包括Transport、Protocol、Processor、Server四个部分。如下图所示:
Transport
Transport:提供了通过网络读写数据的方法;
Thrift 源码中,则是通过将 socket 包装成各种 Transport 来使用
java实现方式:
a、TSocket与TiostreamTransport基于阻塞I/O模型;
b、TnonblockingTransort、TNonblockingSocket基于非阻塞模型;
c、TMemoryInputTransport、TMemoryBuffer基于字节数组作为输入输出流的封装;
d、TFastFramedTransport是内存利用率更高的一个内存读写缓存区,它使用自动增长的byte[](长度不够才新建),而不是每次都新建一个byte[],提高了内存使用率;
Protocol
Transport:提供了对网络传输数据进行序列化/反序列化的具体实现
java实现方式:
a、TbinaryProtocol:二进制格式传输协议
b、TCompactProtocol:压缩二进制格式传输协议
c、TJSONProtocol:JSON格式传输协议
d、TSimpleJSONProtocol:简单的JSON格式数据传输协议
e、TDebugProtocol:调试时使用的文本传输协议
protocol 就是 transport 的上一层。 transport 负责数据传输, 但是要使得程序知道传输的数据具体是什么, 还得靠 protocol 这个组件来对数据进行解析, 解析成对应的结构代码供程序直接调用。
Processor
Thrift通过使用编写的Thrift IDL描述文件来自动生成Processor,它从负责输入的Protocol读取数据,将其传递给处理程序,并将结果发送到负责输出的Protocol。
Processor:通过 transport 和 protocol 这两层之后, 程序已经可以获得对应的数据结构,但是数据结构需要被使用才有价值。 在 Thrift 里面,就是被 processor调用。
Server
Server将Transport、Protocol、Processor组合在一起,将服务运行起来,在指定的端口等待调用端的请求
java实现方式:
a、TnonblockingServer:基于多线程非阻塞I/O模型实现,适用于连接数较多的高并发环境
b、TthreadPoolServer:基于多线程阻塞I/O模型实现,比TNonblockingServer需要耗费更多的系统资源
c、ThsHaServer:半同步、异步服务器
d、TsimpleServer:基于单线程的阻塞I/O模型实现,主要用于测试,不推荐在生产环境中使用
Client
一个同步调用的客户端Client,一个异步调用的客户端AsyncClient
Thrift数据类型
Thrift实现方式
IDL描述性语言:当数据结构发生变化时,必须重新编辑IDL文件并生成相应的代码
基于注解的方式
service <-> @ThriftService注解service类 @ThriftMethod注解该类中的方法
struct <-> @ThriftStruct 注解model类 @ThriftField注解该类中的getter方法
enum <-> @ThriftEnumValue 注解enum
总结
本文只是简单的介绍了thrift的原理以及基本语法,后续文章会以案例的形式给出详细的分析!
以上是关于thrift原理分析的主要内容,如果未能解决你的问题,请参考以下文章