apache thrift分析
thrift是一个用来实现跨语言的远程调用(RPC Remote Procedure Call)的软件框架。根据接口定义语言(IDL Interface definition lanuage) 并借助自身的协议栈和代码生成引擎来生成各种主流语言(C/C++,PYTHON,JAVA,GOLANG,PHP等)的rpc框架的服务端/客户端代码,使得在不同的语言之间可以提供高效的服务。
一:IDL支持的数据类型
- bool 布尔型
- byte 8位整数
- i16 16位整数
- i32 32位整数
- i64 64位整数
- double 双精度浮点数
- string 字符串
- binary 字节数组
- list<i16> List集合
- map<string, string> Map类型
- set<i32> Set集合
二: thrift 架构
服务端
+--------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
| 底层IO Socket/File/Zip |
+-------------------------------------------+
客户端
+-------------------------------------------+
| Client |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
| 底层IO Socket/File/Zip |
+-------------------------------------------+
1、底层IO模块,负责实际的数据传输,包括socket,文件或者压缩数据流等
2、Transport 负责以字节流的方式发送和接收数据,是底层IO模块在thrift框架中的实现,每一个底层IO模块都会有一个对应TTransport来负责Thrift的字节流(Byte Stream)数据在该IO模块上的传输。例如TSocket对应Socket传输,TFileTransport对应文件传输。
3、Protocol(或TProtocol)主要负责结构化数据组装,或者从结构中读出结构化数据。TProtocol将一个有类型的数据转化为字节流以交给TTransport进行传输,或者从TTransport中读取一定长度的字节数据转化为特定类型的数据。如int32会被TBinaryProtocol Encode为一个四字节的字节数据,或者TBinaryProtocol从TTransport中取出四个字节的数据Decode为int32。
4、Processor(或者TProcessor)负责对Client的请求做出响应,包括RPC请求转发,调用参数解析和用户逻辑调用,返回值写回等处理步骤。Processor是服务器端从Thrift框架转入用户逻辑的关键流程
5、TServer负责接收Client的请求,并将请求转发到Processor进行处理。TServer主要任务就是高效的接受Client的请求,特别是在高并发请求的情况下快速完成请求
Thrift的模块设计非常好,在每一个层次都可以根据自己的需要选择合适的实现方式
Transport
transport这一层提供了一个抽象层,从网络上读取,发送数据。 这一层并不解析数据的类型,它只是一个字节一个字节的读取和发送数据
transport支持的几种传输类型:
1. TSocket 使用阻塞的Socket进行IO传输
2. TFramedTransport 使用一个带Buffer的Socket进行IO传输,使用NoblockingServer的时候会需要使用TFramedTransport
3. TFileTransport 使用文件进行IO传输
4. TZlibTransport 与其他的TTransport配合使用,完成数据的压缩传输
Protocol
Protocol的主要任务是把Transport中的字节流转化为数据流(Data Stream),在Protocol这一层就会出现具有数据类型的数据,如整型,浮点数,字符串,结构体等
Protocol中数据虽然有了数据类型,但是Protocol只会按照指定类型将数据读出和写入,而对于数据的真正用途,需要在Thrift自动生成的Server和Client中里处理
Protocol支持的几种主要协议类型为:
1. TBinaryProtocol 所有数据直接按照二进制方式编码
2. TCompactProtocol 高效的编码方式,使用了类似于ProtocolBuffer的Variable-Length Quantity (VLQ) 编码方式,主要思路是对整数采用可变长度,同时尽量利用没有使用Bit。
3. TDenseProtocol 类似于TCompactProtocol,但是传输过程中移除数据的Meta信息
4. TJSONProtocol 使用JSON编码数据
5. TSimpleJSONProtocol 只写方式的JSON编码,适合脚本语言的解析
6. TDebugProtocol 文本方式编码数据,主要用于调试
Processor
Processor是由Thrift生成的TProcessor的子类,主要对TServer中一次请求的 InputProtocol和OutputTProtocol进行操作,也就是从InputProtocol中读出Client的请求数据,向OutputProtcol中写入用户逻辑的返回值。Processor是TServer从Thrift框架转到用户逻辑的关键流程。同时TProcessor.process是一个非常关键的处理函数,因为Client所有的RPC调用都会经过该函数处理并转发
Server
Server在Thrift框架中的主要任务是接收Client的请求,并转到某个TProcessor上进行请求处理。针对不同的访问规模, Thrift提供了不同的TServer模型。Thrift目前支持的Server模型包括:
1. TSimpleServer 使用阻塞IO的单线程服务器,主要用于调试
2. TThreadedServer 使用阻塞IO的多线程服务器。每一个请求都在一个线程里处理,并发访问情况下会有很多线程同时在运行。
3. TThreadPoolServer 使用阻塞IO的多线程服务器,使用线程池管理处理线程。
4. TNonBlockingServer 使用非阻塞IO的多线程服务器,使用少量线程既可以完成大并发量的请求响应。该类型Server必须使用TFramedTransport。
Client
Client跟TProcessor一样都主要操作InputProtocol和OutputProtocol,不同的是Client将RPC调用分为Send和receive两个步骤。
1. Send步骤,将用户的调用参数作为一个整体的Struct写入TProcotol,并发送到TServer。
2. Send结束之后,Client便立刻进入Receive状态等待TServer的相应。对于TServer返回的响应,使用返回值解析类进行返回值解析,完成RPC调用。
参考资料:
http://thrift.apache.org/docs/
https://developers.google.com/protocol-buffers/docs/encoding
http://thrift.apache.org/tutorial/
http://thrift.apache.org/static/files/thrift-20070401.pdf
https://blog.csdn.net/column/details/thrift.html
apache thrift分析的更多相关文章
- Apache Thrift - 可伸缩的跨语言服务开发框架
To put it simply, Apache Thrift is a binary communication protocol 原文地址:http://www.ibm.com/developer ...
- Apache Thrift学习之一(入门及Java实例演示)
目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...
- Apache Thrift的简单使用
Apache Thrift的简单使用 ---------------------- 1. 简介 Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架.它有一个代码生成器来对它所 ...
- Apache thrift - 使用,内部实现及构建一个可扩展的RPC框架
本文首先介绍了什么是Apache Thrift,接着介绍了Thrift的安装部署及如何利用Thrift来实现一个简单的RPC应用,并简单的探究了一下Thrift的内部实现原理,最后给出一个基于Thri ...
- 【转】Apache Thrift - 可伸缩的跨语言服务开发框架
Apache Thrift - 可伸缩的跨语言服务开发框架 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.本文将从 Java 开发人员角度详 ...
- 《精通并发与Netty》学习笔记(06 - Apache Thrift使用简介)
一.概述 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的远程服务调用的框架.Thrift是由Facebook开发的,并在2008年捐给了Apache基金会,成为 ...
- Apache thrift RPC 双向通信
在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...
- Apache Thrift 跨语言服务开发框架
Apache Thrift 是一种支持多种编程语言的远程服务调用框架,由 Facebook 于 2007 年开发,并于 2008 年进入 Apache 开源项目管理.Apache Thrift 通过 ...
- Apache Thrift 环境配置
在 Ubuntu 14.04 下Apache Thrift 的安装方法: 1安装依赖包 sudo apt-get install libboost-dev libboost-test-dev libb ...
随机推荐
- java 处理上传exl数据 并导入数据库
思路:处理上传exl表格,并读取文件,数据,讲数据放去集合,循环插入数据库. 重点,读取文件时需要读数据,格式和数据是否正确,(因为只是把整条路打通,所以这块没有细弄): 项目使用ssm框架, str ...
- bzoj1206-[HNOI2005]虚拟内存
卡读的毒瘤题== 看懂之后用map模拟.或者线段树 #include<cstdio> #include<iostream> #include<cmath> #inc ...
- SQL审计 Yearning 介绍(SQL审核平台)
yearning SQL 是一个成熟的SQL审计平台
- HDU1251 字典树板子题
题意:中文题,统计以某字符串作为前缀的字符串个数 刚学字典树,理解起来十分简单,就是维护一个多叉树,这里用的是链表版本,后面就用的是数组版本了,个人更喜欢数组版本,这里的链表版本就因为 莫名其妙的错误 ...
- Flask 构建微电影视频网站(一)
Flask构建电影视频网站 Python MTV模型 Flask微内核 Flask扩展插件配置及使用方法 根据业务开发网站前后台功能 Flask结合MySQL数据库 你将可以独立开发网站 独立部署运维 ...
- 图片文字识别aip的一个小Demo
目前接触到了一个新的内容,识别图片上的文字,以下是这个Demo 首先需要在需要在百度云-管理中心创建应用 地址:http://console.bce.baidu.com/ai/#/ai/ocr/app ...
- FPGA笔试题集锦(血的教训)
1.名词解释: FPGA:现场可编程门阵列,一般工艺SRAM(易失性),所以要外挂配置芯片. CPLD:复杂可编程逻辑器件,一般工艺Flash(不易失). ASIC:专用集成电路 SOC:片上系统 S ...
- lemon special judge模板
/* argv[1]:输入文件 argv[2]:选手输出文件 argv[3]:标准输出文件 argv[4]:单个测试点分值 argv[5]:输出最终得分的文件 argv[6]:输出错误报告的文件 */ ...
- hdu 2159 FATE (二维完全背包)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2159 思路: dp[j][k] 代表消耗耐久度j,干掉k个敌人获得的经验值. 状态转移方程为: dp[j] ...
- 【BZOJ5315】[JSOI2018]防御网络(动态规划,仙人掌)
[BZOJ5315][JSOI2018]防御网络(动态规划,仙人掌) 题面 BZOJ 洛谷 题解 显然图是仙人掌. 题目给了斯坦纳树就肯定不是斯坦纳树了,,,, 总不可能真让你\(2^n\)枚举点集再 ...