Thrift原理与使用实例
一 Thrift框架介绍
1 前言
Thrift是一个跨语言的服务部署框架,最初由Faceboo开发并进入Apache开源项目。
Thrift特征如下:
1)Thrift有自己的跨机器通信框架,并提供一套库
2)Thrift是一个代码生成器,按照它的规则,可以生成多种编程语言的通信过程代码
Thrift通过中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。
2 架构
1).thrift文件定义数据结构和服务接口
2)代码生成器生成若干符合约定通信格式的代码
3)thrift应用框架:包括thrift自身提供的库函数
4)第三方库:按照运行的模式,生成的代码中可能需要调用第三方库
Thrift实际上是实现了C/S模式,代码生成工具通过接口定义文件,生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。
用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。
protocol协议层:定义数据传输格式,可以为二进制或者XML等
transport传输层:定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享
3、 支持的数据传输格式、数据传输方式和服务模型
(1)支持的传输格式:是对传输协议的封装,传输采用二进制、XML或text来表示信息
TBinaryProtocol – 二进制格式.
TCompactProtocol – 压缩格式
TJSONProtocol – JSON格式
TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。
TDebugProtocol – 使用易懂的可读的文本格式,以便于debug
(2) 支持的数据传输方式:信息的传输渠道以及读写方式
TSocket -阻塞式socker
TFileTransport – 以文件形式进行传输。
TMemoryTransport – 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。
TFramedTransport – 以frame为单位进行传输,非阻塞式服务中使用。
TBufferedTransport -
TZlibTransport – 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。
(3)支持的服务模型
TSimpleServer – 简单的单线程服务模型,常用于测试
TThreadPoolServer – 多线程服务模型,使用标准的阻塞式IO。
TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)
4 利用Thrift部署服务
主要流程:
(1)编写服务说明,保存到.thrift文件
主要包括变量声明、数据结构struct声明、服务service接口声明
一般将服务放到一个.thrift文件中,服务的编写语法与C语言语法基本一致
下面分析Thrift的tutorial中带的例子tutorial.thrift
包含头文件:
include “shared.thrift”
指定目标语言:
namespace cpp tutorial
定义变量:
const i32 INT32CONSTANT = 9853
定义结构体:
struct Work
{
1: i32 num1 = 0,
2: i32 num2,
3: Operation op,
4: optional string comment,
}
定义服务:
service Calculator extends shared.SharedService
{
void ping(),
i32 add(1:i32 num1, 2:i32 num2),
i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch),
oneway void zip()
}
(2)根据需要,编译.thrift文件,生成相应语言的源代码
生成C++代码:./thrift --gen cpp tutorial.thrift,结果代码存放在gen-cpp目录下
生成java代码:./thrift --gen java tutorial.thrift,结果代码存放在gen-java目录下
(3)根据实际需要,编写client端和server端代码
client端和sever端代码要调用编译.thrift生成的中间文件。
下面分析cpp文件下面的CppClient.cpp和CppServer.cpp代码
在client端,用户自定义CalculatorClient类型的对象(用户在.thrift文件中声明的服务名称是Calculator, 则生成的中间代码中的主类为CalculatorClient)
该对象中封装了各种服务,可以直接调用(如client.ping()), 然后thrift会通过封装的rpc调用server端同名的函数。
在server端,需要实现在.thrift文件中声明的服务中的所有功能,以便处理client发过来的请求。
二 Thrift使用指南
1 语法参考
1.1 types
Thrift类型系统包括预定义基本类型,用户自定义结构体,容器类型,异常和服务定义
1.2 注释
1.3 命名空间
1.4 文件包含
1.5 常量
1.6 定义服务:
Service支持继承,一个service可使用extends关键字继承另一个service
2 产生代码
Thrift的网络栈如下:
Transport:
TransPort层提供了简单的网络读写抽象层。
Transport接口提供的方法:open、close、read、write、flush
除了以上几个接口,Thrift使用ServerTransport接口接受或者创建原始transport对象
ServerTransport用在server端,为到来的连接创建Transport对象:open、listen、accept、close
Protocol
Protocol抽象层定义了一种将内存中数据结构映射成可传输格式的机制
Protocol的实现要给出编码机制并负责对数据进行序列化
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()
Processor
Processor封装了从输入数据流中读数据和向数据数据流中写数据的操作。读写数据流用Protocol对象表示
Processor的结构体非常简单:
interface TProcessor
{
bool process(TProtocol in, TProtocol out) throws TException
}
与服务相关的processor实现由编译器产生。
Processor主要工作流程如下:从连接中读取数据(使用输入protocol),将处理授权给handler(由用户实现),最后将结果写到连接上(使用输出protocol)。
Server
Server将以上所有特性集成在一起:
(1) 创建一个transport对象
(2) 为transport对象创建输入输出protocol
(3) 基于输入输出protocol创建processor
(4) 等待连接请求并将之交给processor处理
综合:
http://blog.csdn.net/guxch/article/details/12157151
http://blog.sina.com.cn/s/blog_72995dcc0101gn82.html
Thrift原理与使用实例的更多相关文章
- Thrift 原理与使用实例
一.Thrift 框架介绍 1.前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定 ...
- Thrift入门及Java实例演示<转载备用>
Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...
- Win Socket编程原理及简单实例
[转]http://www.cnblogs.com/tornadomeet/archive/2012/04/11/2442140.html 使用Linux Socket做了小型的分布式,如Linux ...
- Python实现的选择排序算法原理与用法实例分析
Python实现的选择排序算法原理与用法实例分析 这篇文章主要介绍了Python实现的选择排序算法,简单描述了选择排序的原理,并结合实例形式分析了Python实现与应用选择排序的具体操作技巧,需要的朋 ...
- [转载] Thrift原理简析(JAVA)
转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开 ...
- JSONP的诞生、原理及应用实例
问题: 页面中有一个按钮,点击之后会更新网页中的一个盒子的内容. Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求. 但是,Ajax有一个缺点,就是他不允许跨域请求资源. 如果我的 ...
- RPC原理及RPC实例分析
在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服务消费方和服务提供方是本地调用关系. 1 2 3 4 5 6 public class ...
- 简单的jquery拖曵原理js特效实例
<!DOCTYPE html> <html> <title>简单拖曵原理实例</title> <script language="jav ...
- Thrift入门及Java实例演示
目录: 概述 下载配置 基本概念 数据类型 服务端编码基本步骤 客户端编码基本步骤 数据传输协议 实例演示(java) thrift生成代码 实现接口Iface TSimpleServer服务模型 T ...
随机推荐
- eclipse 护眼色
eclipse windows 窗口背景颜色 保护视力 博客分类: 工具使用 EclipseWindows eclipse 窗口背景颜色 windows 窗口背景颜色
- dataGridView控件--未将对象引用设置添加到对象的实例
上篇博客中我完成了如何将控件中的数据导出到excel中dataGridView控件--导出Excel,当我成功导出后,又再次遇到了新问题---未将对象引用设置添加到对象的实例 解决办法: 1 .将代 ...
- UVA 705 Slash Maze
Slash Maze By filling a rectangle with slashes (/) and backslashes ( ), you can generate nice litt ...
- windows 2003 远程登录时如何修改管理员密码
今天买的vps,需要修改密码.但是自己不会,看网上好多人都说是,按ctrl+alt+del .但是我试过之后发现不对,后来又找到说是使用ctrl+alt+end 更改密码就可以了. 千万不要通过那个 ...
- Windows下记事本编辑的Shell脚本放到Linux下执行出错,格式问题(/bin/bash^M: bad interpreter: 没有那个文件或目录)
错误: /bin/bash^M: bad interpreter: 没有那个文件或目录 解决方案: 运行脚本时出现了这样一个错误,打开之后并没有找到所谓的^M,查了之后才知道原来是文件格式的问题,也就 ...
- hdu 5441 Travel 离线带权并查集
Travel Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5441 De ...
- git reset and git checkout
git reset --hard <commit>: 1.替换引用的指向.引用指向新的提交ID; 2.替换暂存区.替换后,暂存区的内容和引用指向的文件夹树一致; 3.替换工作区.替换后,工 ...
- Qt界面设计1
最近刚接触Qt 对于QML做界面感觉已经很轻松了,但是想尝试一下GUI..准备做一个理财的小软件 ....慢慢记录我的一点一滴的学习经历. 自己封装界面UI 遇到了好多新手级别的问题=_=!!! 1. ...
- forward_list例子
9.28 编写函数,接受一个forward_list<string>和两个string共三个参数.函数应在链表中查找第一个string,并将第二个string插入到紧接着第一个string ...
- Cookie API
Cookie API All cookies created by the Nova framework are encrypted and signed with an authentication ...