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介绍

可以用一张图体现:

640?wx_fmt=png

Thrift工作流程

  1. 设计所需要的服务

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

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

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

  5. 运行服务端与客户端

Thrift内部运行

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

640?wx_fmt=png

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

640?wx_fmt=png

640?wx_fmt=jpeg640?wx_fmt=jpeg

640?wx_fmt=png

Thrift数据类型

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

Thrift实现方式

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

  2. 基于注解的方式

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

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

  • enum <-> @ThriftEnumValue 注解enum

总结

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值