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. 添加script标签、添加事件

    添加script标签 var _hmt = _hmt || [];    (function () {        var hm = document.createElement("scr ...

  2. SQL2012 之 创建备份计划

    打开数据库,选择 管理 → 右键维护计划→选择新建维护计划,填写计划名称,如下图: 修改维护计划参数,如下图: 工具箱->备份数据库任务,拖到计划里,如下图: 编辑“备份数据库”任务,如下图: ...

  3. postgresql 函数获取多个字段的数字大小值

    1.GREATEST(n1,n2,n3,..........) 获取最大值 testdb=#SELECT GREATEST(,,,,,,,,,); +------------------------- ...

  4. swift4.0 对 afn 进行二次封装

    先将  afn 用pod导入到 工程中 创建一个类 ZHttpTools 继承自 AFHTTPSessionManager 一般我们不希望网络请求同时有多个存在,所以我们将这个工具类  设计成单例 代 ...

  5. C# MD5 加密,解密

    //生成cs文件 public class MD5Help { ///MD5加密 public static string MD5Encrypt(string pToEncrypt, string s ...

  6. asp.net C# int 类型在32/64位环境下取值范围无变化

    最近在学习中突然想到,我在64位环境下,int取值范围是否有变化?为了检测这个结果,我做了以下这个测试:1.环境:win7旗舰版64位+vs2010 sp1(版本号:10.0.40219.1SP1Re ...

  7. Python CBV和FBV

    ''' 说一下CBV(class+base+views)和FBV(function+base+views),我们之前Django 里写的都是FBV,今天看一下 CBV,也就是在我们的视图函数里写类 ' ...

  8. [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现

    [Android实例教程] 教你如何拍照+相册选择图片+剪裁图片完整实现 今天做Android项目的时候要用到图片选择,要实现拍照获取图片和从相册获取图片,并且要求在获取完之后可以裁剪,试了很多方法之 ...

  9. 【被C折腾系列】用C调DIOCP编码客户端通信

    前几天有个朋友,说他们公司做手游,服务端用的DIOCP3里面做文件服务器,客户端用cocos-x,在调试与diocp通信时老是失败! 于是,我下载了一个Codeblocks经过几个小时的折腾,终于折腾 ...

  10. 【Socket】关于socket长连接的心跳包

    TCP的socket本身就是长连接的,那么为什么还要心跳包呢? 在smack里有个30s发送一个空消息的线程,同样关于心跳包(keepalive) 据网络搜索到的资料解释如下 内网机器如果不主动向外发 ...