Thrift最初是由Facebook开发的,因为随着流量和网络结构的扩展,一些操作如搜索、分发、事件日志记录等已经超出系统的处理范围,所以Facebook的工程师开发服务时选择了多种不同的编程语言来达到满意的性能、快速开发、已有库的重用。Thrift于2007年4月开源并于2008年5月进入Apache孵化器,在2010年10月成为Apache TLP。

Thrift是一个可扩展的跨语言服务的软件开发框架,目标是尽可能高效和无缝地跨语言进行可靠的高性能通信和数据序列化,Thrift通过中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,利用代码生成器生成不同语言的代码(如C++,Java, Python, PHP. . .等),并由生成的代码负责RPC协议层和传输层的实现。

Thrift网络堆栈

   +-------------------------------------------+

  | Server                                    |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+

传输(Transport)

传输层为网络读取/写入网络提供了一个简单的抽象,这使得Thrift能够将底层传输与系统其它部分分离(如序列化/反序列化)。下面是一些Transport接口支持的方法

● open

● close

● read

● write

● flush

另外Thrift还提供了用于接收和创建基本Transport对象的ServerTransport接口。顾名思义,ServerTransport主要用于服务器端,为传入连接创建新的Transport对象。ServerTransport接口支持的方法

● open
● listen
● accept
● close

协议(Protocol)

协议层抽象定义了将内存数据结构映射为传输格式的机制。换句话说,一个协议规定了数据类型如何使用Transport来对自身进行编码/解码。因此,协议实现管理编码方案并负责序列化和反序列化。Protocol实现的一些例子包括JSON,XML,纯文本,紧凑二进制等。

Protocol接口有

writeMessageBegin(name, type, seq)
writeMessageEnd()
writeStructBegin(name)
writeStructEnd()
writeFieldBegin(name, type, id)
writeFieldEnd()
writeFieldStop()
writeMapBegin(ktype, vtype, size)
writeMapEnd()
writeListBegin(etype, size)
writeListEnd()
writeSetBegin(etype, size)
writeSetEnd()
writeBool(bool)
writeByte(byte)
writeI16(i16)
writeI32(i32)
writeI64(i64)
writeDouble(double)
writeString(string) name, type, seq = readMessageBegin()
readMessageEnd()
name = readStructBegin()
readStructEnd()
name, type, id = readFieldBegin()
readFieldEnd()
k, v, size = readMapBegin()
readMapEnd()
etype, size = readListBegin()
readListEnd()
etype, size = readSetBegin()
readSetEnd()
bool = readBool()
byte = readByte()
i16 = readI16()
i32 = readI32()
i64 = readI64()
double = readDouble()
string = readString()

Thrift的Protocol是面向流设计的,因此没有必要去显式分帧(framing)。比如,在开始序列化之前我们可以不用关心我们传输的字符串长度或者列表中元素的个数。在Thrift支持的大部分编程语言中可供使用的Protocol类型有:

  • binary:简单二进制编码–字段长度和类型被编码成二进制并紧跟在实际字段值后面
  • compat: 详情见THRIFT-110
  • json

处理层(Processor)

处理层封装了从输入流中读取数据并写入输出流的能力。Protocol对象即代表输入流和输出流。Processor接口非常简单。

interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}

特定服务的Processor由编译器自动生成实现。Processor通过输入Protocol从网路上读取数据,并将数据处理代理给用户实现的Handler,最后通过输出Protocol将数据写回到网路上。

服务器层(server)

服务器层将上述所有各种功能汇集在一起​​:

  • 创建一个Transport
  • 为Transport创建输入/输出Protocol
  • 基于输入/输出Protocol创建一个Processor
  • 等待传入连接并将它们交给处Processor

Thrift的一些概念的更多相关文章

  1. thrift中的概念

    Thrift的网络栈 Apache Thrift的网络栈的简单表示如下: +-------------------------------------------+ | Server | | (sin ...

  2. 在.net core中使用Thrift

    Thrift应用比较广泛,这里不介绍Thrift的基本概念和使用.Thrift对.net支持的很好,但自从.net core诞生引来,我曾多次关注Thrift的官方网站,看看对.net core是否提 ...

  3. rpc框架之 thrift 学习 2 - 基本概念

    thrift的基本构架: 上图源自:http://jnb.ociweb.com/jnb/jnbJun2009.html 底层Underlying I/O以上的部分,都是由thrift编译器生成的代码, ...

  4. thrift基本概念和实例

    一.thrift可以做什么 thrift是一个跨语言通信的工具,支持的语言多,而且还提供服务器端的众多网络模型,使服务端的开发可以只专于服务本身的逻辑. 二.thrift重要概念 1.processo ...

  5. Thrift源码分析(一)-- 基本概念

    我所在的公司使用Thrift作为基础通信组件,相当一部分的RPC服务基于Thrift框架.公司的日UV在千万级别,Thrift很好地支持了高并发访问,并且Thrift相对简单地编程模型也提高了服务地开 ...

  6. 和 Thrift 的一场美丽邂逅

    一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...

  7. thrift笔记

    Thrift tutorial 演示 python服务端与客户端本文的开发环境是windows 7 + python2.7.3Thrift官方主页:http://thrift.apache.org/先 ...

  8. Thrift入门及Java实例演示<转载备用>

    Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...

  9. RPC学习----Thrift快速入门和Java简单示例

    一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...

随机推荐

  1. Android四大组件应用系列5——使用AIDL实现跨进程调用Service

    一.问题描述 Android应用程序的四大组件中Activity.BroadcastReceiver.ContentProvider.Service都可以进行跨进程.在上一篇我们通过ContentPr ...

  2. Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换

    一.问题描述 在上次博文中,我们使用RadioGroup+ViewPage+Fragmen实现了顶部滑动导航(查看文章:http://www.cnblogs.com/jerehedu/p/460759 ...

  3. plsql连接oracle数据库,不用配置任何东西(转)

    在软件开发的过程中,对于使用oracle的朋友们来说,使用plsql工具操作oracle数据库是非常方便的,可是plsql连接oracle数据库的方式有很多种,今天就给大家介绍一种最简单的连接方式,只 ...

  4. sprintf将CString转换成char[]

      在MFC中使用sprintf()函数将CString转换成char[]时,char[]只接受第一个字符 使用的是VS2008 CString name;dbName="test" ...

  5. Java动态代理实现方法

    import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflec ...

  6. OpenCV 学习笔记 05 级联分类器CascadeClassifier类

    在人脸检测中,CascadeClassifier 是一个类,该类的作用是(基于官方已经训练好的数据文件 .xml)实例化一个检测器. 1 类 CascadeClassifier 的概述 首先看一下该类 ...

  7. OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  8. GraphQL,你准备好了么?

    一个多月前,facebook 将其开源了一年多的 GraphQL 标记为 production ready ( http://graphql.org/blog/production-ready/ ), ...

  9. Android Studio 插件(plugins)或者intellij idea 插件(plugins)无法安装

    通常这种情况出现都因为idea.properties修改了 idea.system.path=${指定路径}/system idea.plugins.path=${idea.config.path}/ ...

  10. win8使用技巧

    windows 8操作系统相信大家已经不再陌生了,虽然正式版本还未发布,但不少朋友已经在使用微软事先推出的windows 消费者预览版,直白的说就是公测版,预览版是免费的,但仅可以使用一年,但其功能与 ...