什么是Thrift
起源
- 百度百科怎么说
thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。 它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,
JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
thrift最初由facebook开发,07年四月开放源代码,08年5月进入apache孵化器。 thrift同意你定义一个简单的定义文件里的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPCclient和server通信的无缝跨编程语言。
- 互动百科的观点
Thrift是Facebook的核心技术框架之中的一个,使不同语言开发的系统能够通过该框架进行通信。开发人员使用thrift提供的格式来定义数据和服务脚本。 thrift能够通过定义的脚本自己主动生成不同语言的代
码以支持不同语言之间的通信。thrift支持多种数据通信协议,比方xml,jason,binnary等等。
Thrift并非唯一的跨语言通信框架。像google的protocol buffers也是与之类似的框架。 关于两者之前的比較能够去google一下。
- 我的总结
Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的 facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输
通信以及系统之间语言环境不同须要跨平台的特性。所以thrift能够支持多种程序语言,比如: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多种不
同的语言之间通信thrift能够作为二进制的高性能的通讯中间件。支持数据(对象)序列化和多种类型的RPC服务。
特性
- 框架
- 开源项目
- 通讯中间件
- 跨语言
- RPC服务(Remote Procedure Call Protocol——远程过程调用协议)
- IDL工具(Interface Description Language——接口描写叙述语言)
- 高并发
- TCompactProtocol协议
基础架构
- Thrift适用于程序对程 序静态的数据交换,须要先确定好他的数据结构,他是全然静态化的,当数据结构发生变化时,必须又一次编辑IDL文件,代码生成,再编译加载的流程,跟其它 IDL工具相比較能够视为是Thrift的弱项,Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部传输数据相对于JSON和 xml不管在性能、传输大小上有明显的优势。
- Thrift是IDL(interface definition language)描写叙述性语言的一个详细实现,关于IDL的话题我们能够追溯到CORBA盛行1999-2001年(Common Object Request Broker Architecture/公用对象请求代理体系结构),在 IDL 中我们似乎不会忘记到这几个keyword:module、interface、string、long 和 int,我还记得IDL利用module来创建名称空间。而且准确地映射为
Java 的 package。这些特性差点儿和如今thrift的特性全然同样,所以thrift的设计思想和理念绝不是什么从火星来的new idea,看看在那个CORBA盛行的年代人们提出的概念。如图所看到的CORBA 请求的各个部分。回头我们再与thrift进行对照一下: - Thrift是一个服务端和client的架构体系。从我个人的感官上来看Thrift是一个类似XML-RPC+Java-to- IDL+Serialization Tools=Thrift 的东东。Thrift 具有自己内部定义的传输协议规范(TProtocol)和数据传输标准(TTransports)。通过IDL脚本对数据传输的数据结构(struct) 和数据传输的业务逻辑(service)依据不同的执行环境高速的构建对应的代码,而且通过自己内部的序列化机制对传输的数据进行简化和压缩提高高并发、
大型系统中数据交互的成本,下图描绘了Thrift的总体架构。分为6个部分:1.你的业务逻辑实现(You Code) 2.client和服务端相应的Service 3.运行读写操作的计算结果4.TProtocol 5.TTransports 6.底层I/O通信。
说明:图中前面3个部分是1.你通过Thrift脚本文件生成的代码,2.图中的褐色框部分是你依据生成代码构建的client和处理器的代码,3.图中红色的部分是2 端产生的计算结果。
从TProtocol以下3个部分是Thrift的传输体系和传输协议以及底层I/O通信,Thrift而且提供 阻塞、非阻塞,单线程、多线程的模式执行在server上,还能够配合server/容器一起执行,能够和现有JEEserver/Web容器无缝的结合。
数据类型
- Base Types:基本类型
- Struct:结构体类型
- Container:容器类型,即List、Set、Map
- Exception:异常类型
- Service: 定义对象的接口,和一系列方法
协议
Thrift能够让你选择client与服务端之间传输通信协议的类别,在传输协议上整体上划分为文本(text)和二进制(binary)传输协议, 为节约带宽,提供传输效率,普通情况下使用二进制类型的传输协议为多数,但有时会还是会使用基于文本类型的协议,这须要依据项目/产品中的实际需求:
- TBinaryProtocol – 二进制编码格式进行传输数据。
- TCompactProtocol – 这样的协议很有效的。使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
- TJSONProtocol – 使用JSON的数据编码协议进行传输数据。
- TSimpleJSONProtocol – 这样的节约仅仅提供JSON仅仅写的协议,适用于通过脚本语言解析
- TDebugProtocol – 在开发的过程中帮助开发者调试用的,以文本的形式展现方便阅读。
传输层
- TSocket- 使用阻塞式I/O进行传输,也是最常见的模式。
- TFramedTransport- 使用非阻塞方式,按块的大小。进行传输,类似于Java中的NIO。
- TFileTransport- 顾名思义依照文件的方式进程传输,尽管这样的方式不提供Java的实现。可是实现起来很easy。
- TMemoryTransport- 使用内存I/O。就好比Java中的ByteArrayOutputStream实现。
- TZlibTransport- 使用运行zlib压缩,不提供Java的实现。
服务端类型
- TSimpleServer - 单线程server端使用标准的阻塞式I/O。
- TThreadPoolServer - 多线程server端使用标准的阻塞式I/O。
- TNonblockingServer – 多线程server端使用非阻塞式I/O,而且实现了Java中的NIO通道。
货比三家
Thrift与其它传输方式的比較
- xml与JSON相比。体积太大。可是xml传统。也不算复杂。
- json体积较小,新颖。但不够完好。
- thrift体积超小,使用起来比較麻烦,不如前两者轻便。可是对于1.高并发、2.传输数据量大、3.多语言环境, 满足当中2点使用 thrift还是值得的。
假定须要传输同样的内容。但使用不同的方式从1、传输内容所产生的大小 2、传输过程中服务端和client所产生的开销,这2个方便进行比較。使用Thrift和其它方式的所产生的内容大小比較结果例如以下:
在上图中我们能明显看出,最臃肿的是RMI,其次是xml,使用Thrift的TCompactProtocol协议和Google 的 Protocol Buffers 相差的不算太多,相比而言还是Google 的 Protocol Buffers效果最佳。
谁在用
Thrift用于Quara系统后端数据的通信,服务端是用C++来实现的。client则是python。
Quara背景:Quara是在线问答服务公司,类似新浪微博和百度知道的合体。消息灵通人士透露,去年Quara获得了1400万美元投资。眼下他们仅仅有9名员工。
原文:http://www.philwhln.com/quoras-technology-examined#thrift
Thrift用于在多种Evernote API平台开发的client与Evernoteserver之间的通信与传输数据,Evernote API定义了自己的Evernote Data Access and Management (EDAM) 协议规范,让client使用更小的网络带宽上传、下载文件和在线即时搜索服务。
Evernote 背景:EverNote是一款很著名的免费软件,它最大的特点就是支持多平台,并且数据能通过网络互同样步。譬如说,你能够随时在手机上的Evernote新增笔记,回家后在电脑上也能看到它了。
原文:http://www.evernote.com/about/developer/api/evernote-api.htm
HBase 中的Thrift
Thrift用于HBase中是为了提供跨平台的服务接口,在HBase 中能够使用[hbase-root]/bin/hbase thrift start 命令启动涵盖Thrift的HBase服务端。client通过thrift的命令生成不同版本号的client代码,依据定义的数据格式。对远程HBase服务端进行 操作。是除了REST远程方法调用的还有一种途径。
參见:http://wiki.apache.org/hadoop/Hbase/ThriftApi
调研结论
- 高并发
- 传输数据量大
- 多语言环境
什么是Thrift的更多相关文章
- 和 Thrift 的一场美丽邂逅
一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...
- Apache thrift RPC 双向通信
在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...
- common-pool2 学习:thrift连接池的另一种实现
对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造轮子,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...
- thrift:swift项目笔记
先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...
- dubbo/dubbox 增加原生thrift及avro支持
(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...
- Thrift的TJsonProtocol协议分析
Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原 ...
- Thrift的TBinaryProtocol二进制协议分析
先上张图,说明一下thrift的二进制协议是什么东东. 报文格式编码: bool类型: 一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0). Byte类型: 一个字节的类 ...
- 高可用thrift客户池的实现详解
最近,公司要求将组内的thrift客户端组件推广至公司内使用.基本的要求如下: 1.高可用 2.集成名称服务,也就配置文件支持服务发现 3.解耦,客户端和高可用组件解耦,简单来说就是,如果以后要切换其 ...
- 2016windows(10) wamp 最简单30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world
2016最简单windows(10) wamp 30分钟thrift入门使用讲解,实现php作为服务器和客户端的hello world thrift是什么 最简单解释 thrift是用来帮助各个编程语 ...
- thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)
关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1) Linux下环境配置 ...
随机推荐
- leetcode Roman to Integer python
class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int "& ...
- php小数点后取两位的三种实现方法
php小数点后取两位的方法. 方法一.经常用到小数点后取几位,但不能进位的情况. 比如3.149569取小数点后两位,最后两位不能四舍五入.结果:3.14. 可以使用函数floor. 该函数是舍去取整 ...
- Mysql笔记之 -- replace()实现mysql 替换字符串
mysql 替换函数replace()实现mysql 替换字符串 mysql 替换字符串的实现方法: mysql中replace函数直接替换mysql数据库中某字段中的特定字符串,不再需要自己写函数 ...
- codeforces 631D. Messenger kmp
题目链接 首先想到kmp, 和普通的不一样的是,中间部分严格相等, 头和尾的字符相等但是数量可以不相等. 所以应该把子串的头和尾先去掉,然后对剩下的部分进行kmp. 子串长度为1或2要特别讨论. 不要 ...
- SQL Server 数据库所有者
1. 数据库所有者应当永远是 sa 用户 2. 改变数据库的所有者 alter authorization on database :: databaseName to sa; -- 这一句话把数据库 ...
- android小知识之中如何获取当前时间
百度整理过来的 [java] view plaincopyprint? import java.text.SimpleDateFormat; SimpleDateFormat format ...
- PROS Step:只需几分钟即可创建优化的价目表,并发现即时收益机会。
多年来,各个公司一直使用手动流程和电子表格来制定产品和服务定价,而没有真正意义上的方法或策略.在我写这篇文章时仍然如此! 但是,如今的形势已经改变.利用 PROS Step,公司可以将其数据上传到 M ...
- winform文件迁移工具
服务器D盘上传的文件过多,空间剩下很少了,于是想把里面部分文件,大概几万个文件转移到E盘,做了这个小工具.先查询出要转移的文件清单,保存在一个记事本中,如下所示: 接着读取文件名,一个个移动到指定目录 ...
- js 定义类对象
//定义类 //方式一 function A_class(arg1,arg2){ this.arg1=arg1; this.arg2=arg2; ...
- java载入XML文件并解析xml
import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentExce ...