Thrift的一些概念
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的一些概念的更多相关文章
- thrift中的概念
Thrift的网络栈 Apache Thrift的网络栈的简单表示如下: +-------------------------------------------+ | Server | | (sin ...
- 在.net core中使用Thrift
Thrift应用比较广泛,这里不介绍Thrift的基本概念和使用.Thrift对.net支持的很好,但自从.net core诞生引来,我曾多次关注Thrift的官方网站,看看对.net core是否提 ...
- rpc框架之 thrift 学习 2 - 基本概念
thrift的基本构架: 上图源自:http://jnb.ociweb.com/jnb/jnbJun2009.html 底层Underlying I/O以上的部分,都是由thrift编译器生成的代码, ...
- thrift基本概念和实例
一.thrift可以做什么 thrift是一个跨语言通信的工具,支持的语言多,而且还提供服务器端的众多网络模型,使服务端的开发可以只专于服务本身的逻辑. 二.thrift重要概念 1.processo ...
- Thrift源码分析(一)-- 基本概念
我所在的公司使用Thrift作为基础通信组件,相当一部分的RPC服务基于Thrift框架.公司的日UV在千万级别,Thrift很好地支持了高并发访问,并且Thrift相对简单地编程模型也提高了服务地开 ...
- 和 Thrift 的一场美丽邂逅
一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...
- thrift笔记
Thrift tutorial 演示 python服务端与客户端本文的开发环境是windows 7 + python2.7.3Thrift官方主页:http://thrift.apache.org/先 ...
- Thrift入门及Java实例演示<转载备用>
Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...
- RPC学习----Thrift快速入门和Java简单示例
一.什么是RPC? RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. RPC协议 ...
随机推荐
- c++数组的引用
引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样.引用的声明方法:类型标识符 &引用名=目标变量名: 引用最大的好处就是提高函数效率以及节省空间; 关键问题一.传递引用 ...
- JAVA代码中获取JVM信息
一.JAVA中获取JVM的信息 原理,利用JavaSDK自带的ManagementFactory类来获取. 二.获取信息 1.获取进程ID @Test public void test1() { Ru ...
- iOS APP 安全测试
1.ipa包加壳 首先,我们可以通过iTunes 下载 AppStore的ipa文件(苹果 把开发者上传的ipa包 进行了加壳再放到AppStore中),所以我们从AppStore下载的ipa都是加壳 ...
- 基于CentOS搭建Nginx 静态网站
系统要求: CentOS 7.2 64 位操作系统 一. 安装 Nginx(在 CentOS 上,可直接使用 yum 来安装 Nginx) yum install nginx -y 安装完成后,使用 ...
- SNF快速开发平台MVC-高级查询组件
1. 高级查询 在我们做项目的时候经常想要按名称.编号进行查询数据,可在开发时会把最常用的查询条件写上,不常用的就不写了,也是因为把所有字段都写上太多了,布局不好看而且不实用.还有些查询条件几百年 ...
- MongoDB 聚合操作(转)
在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...
- 基础006_pg109_IP-Xfft
作者:桂. 时间:2018-05-09 07:20:48 链接:http://www.cnblogs.com/xingshansi/p/9012232.html 前言 简要记录xilinx FFT的 ...
- 无意识(无知)-->有意识-->进入潜意识-->无意识(本能状态)
无意识(无知)-->有意识-->进入潜意识-->无意识(本能状态) 1. 从“无意识-->有意识”的两个重要内容是“反省”+“要努力学习”,估计有80%的人无法跨过这一步 2. ...
- 全面理解Javascript闭包和闭包的几种写法及用途【转】
一.什么是闭包和闭包的几种写法和用法 1.什么是闭包 闭包,官方对闭包的解释是:一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分.闭包的特点: 1. ...
- pattern-matching as an expression without a prior match -scala
https://www.scala-lang.org/files/archive/spec/2.11/08-pattern-matching.html https://docs.scala-lang. ...