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. ShardedJedisPool的使用

    package com.test; import java.util.ArrayList; import java.util.List; import redis.clients.jedis.Jedi ...

  2. eclipse plugin development -menu

    org.eclipse.ui.menus locationURI MenuContribution locationURI = "[Scheme]:[id]?[argument-list]& ...

  3. C语言(C++语言)中##(两个井号)和#(一个井号)用法[转]

    文章来源:http://blog.csdn.net/starboybenben/article/details/49803315 C语言(C++语言)中的宏(Macro)属于编译器预处理的范畴,属于编 ...

  4. 译:9.使用Redis进行消息传递

    本指南引导您完成使用Spring Data Redis发布和订阅通过Redis发送的消息的过程.Messaging with Redis 1. 我们将构建什么? 您将构建一个使用StringRedis ...

  5. [svc]tomcat配置文件详解-最简单的基于mvn的war包

    tomcat安全管理规范 java&tomcat配置参考(多看看这位大牛的博客,写的很好) Tomcat系列之Java技术详解 http://blog.51cto.com/freeloda/1 ...

  6. Socket网络编程--聊天程序(4)

    上一小节讲到可以实现多客户端与服务器进行通讯,对于每一个客户端的连接请求,服务器都要分配一个进程进行处理.对于多用户连接时,服务器会受不了的,而且还很消耗资源.据说有个select函数可以用,好像还很 ...

  7. linux source code search

    https://elixir.bootlin.com/linux/latest/source/fs/eventpoll.c#L1120

  8. GDB用法简要整理

    [时间:2017-05] [状态:Open] [关键词:gdb,调试,debug,用户手册] 使用gdb是需要在编译是指定-g命令,在可执行文件中添加符号信息. 1. 启动和退出 可以使用gdb gd ...

  9. js绝对地址图片转换成base64的方法

    //将图片转换成base64 function getBase64Image(url, callback){ var canvas = document.createElement('canvas') ...

  10. Could not load file or assembly 'System.Core, Version=2.0.5.0

    项目中用的4.0,本机没问题,服务器上出现问题,查了一下发现  autofac 里面用的这个版本 解决:下载安装这个4.0的补丁 http://support.microsoft.com/kb/246 ...