thrift原理分析

Posted 咖啡拿铁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了thrift原理分析相关的知识,希望对你有一定的参考价值。

简介

  • Thrift是一款Facebook开发的rpc框架( remote procedure call),并且已经加入到Apache项目。

  • Thrift是采用二进制编码协议,使用TCP/IP传输协议的一种RPC实现,而XML-RPC/JSON-RPC/SOAPWSDL协议栈采用文本协议WSDL的实现WebService采用HTTP作为传输协议,对于网络数据传输,TCP/IP协议的性能要高于HTTP协议,不仅因为HTTP协议是应用层协议,HTTP协议传输内容除了应用数据本身之外,还有响应状态码、Header信息等。


RPC介绍

可以用一张图体现:


Thrift工作流程


  1. 设计所需要的服务

  2. 根据设计的服务,编写Thrift IDL服务描述文件

  3. 根据编写的Thrift IDL服务描述文件使用Thrift提供的代码生成工具生成服务端与客户端的代码

  4. 实现服务端业务逻辑的编写,同时实现客户端调用代码的编写

  5. 运行服务端与客户端

Thrift内部运行

Thrift运行时的网络堆栈包括TransportProtocolProcessorServer四个部分。如下图所示:

thrift原理分析

Transport

  • Transport:提供了通过网络读写数据的方法;

  • Thrift 源码中,则是通过将 socket 包装成各种 Transport 来使用

  • java实现方式:

    a、TSocketTiostreamTransport基于阻塞I/O模型;

    b、TnonblockingTransortTNonblockingSocket基于非阻塞模型;

    c、TMemoryInputTransportTMemoryBuffer基于字节数组作为输入输出流的封装;

    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

  • ServerTransportProtocolProcessor组合在一起,将服务运行起来,在指定的端口等待调用端的请求

  • java实现方式:

    a、TnonblockingServer:基于多线程非阻塞I/O模型实现,适用于连接数较多的高并发环境

    b、TthreadPoolServer:基于多线程阻塞I/O模型实现,比TNonblockingServer需要耗费更多的系统资源

    c、ThsHaServer:半同步、异步服务器

    d、TsimpleServer:基于单线程的阻塞I/O模型实现,主要用于测试,不推荐在生产环境中使用

Client

  • 一个同步调用的客户端Client,一个异步调用的客户端AsyncClient

thrift原理分析

thrift原理分析thrift原理分析

thrift原理分析

Thrift数据类型

thrift原理分析

thrift原理分析

thrift原理分析

thrift原理分析

Thrift实现方式

  1. IDL描述性语言:当数据结构发生变化时,必须重新编辑IDL文件并生成相应的代码

  2. 基于注解的方式

  • service <-> @ThriftService注解service @ThriftMethod注解该类中的方法

  • struct <-> @ThriftStruct 注解model @ThriftField注解该类中的getter方法

  • enum <-> @ThriftEnumValue 注解enum


总结

本文只是简单的介绍了thrift的原理以及基本语法,后续文章会以案例的形式给出详细的分析!


以上是关于thrift原理分析的主要内容,如果未能解决你的问题,请参考以下文章

Thrift的TJsonProtocol协议分析

Dubbo底层原理,java分布式框架,源码分析

RPC远程协议之Thrift入门

dubbo客户端源码分析

thrift系列原理

RPC原理与实践----Thrift分层模型