前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >thrift原理分析

thrift原理分析

作者头像
用户5397975
发布2019-10-13 15:11:33
2.4K0
发布2019-10-13 15:11:33
举报
文章被收录于专栏:咖啡拿铁咖啡拿铁

简介

  • 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工作流程

  1. 设计所需要的服务
  2. 根据设计的服务,编写Thrift IDL服务描述文件
  3. 根据编写的Thrift IDL服务描述文件使用Thrift提供的代码生成工具生成服务端与客户端的代码
  4. 实现服务端业务逻辑的编写,同时实现客户端调用代码的编写
  5. 运行服务端与客户端

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实现方式

  1. IDL描述性语言:当数据结构发生变化时,必须重新编辑IDL文件并生成相应的代码
  2. 基于注解的方式
  • service <-> @ThriftService注解service类 @ThriftMethod注解该类中的方法
  • struct <-> @ThriftStruct 注解model类 @ThriftField注解该类中的getter方法
  • enum <-> @ThriftEnumValue 注解enum

总结

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 咖啡拿铁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档