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

时间: 2024-07-31 00:35:09

Thrift原理与使用实例的相关文章

Adaboost算法原理分析和实例+代码(简明易懂)

Adaboost算法原理分析和实例+代码(简明易懂) [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/details/70995333     本人最初了解AdaBoost算法着实是花了几天时间,才明白他的基本原理.也许是自己能力有限吧,很多资料也是看得懵懵懂懂.网上找了一下关于Adaboost算法原理分析,大都是你复制我,我摘抄你,反正我也搞不清谁是原创.有些资料给出的Adaboost实例,要么是没有代码,要么省略很多步骤,让初学者

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

Thrift入门及Java实例演示 作者: Michael 日期: 2012 年 6 月 14 日 •概述 •下载配置 •基本概念 1.数据类型 2.服务端编码基本步骤 3.客户端编码基本步骤 4.数据传输协议 •实例演示(java) 1. thrift生成代码 2. 实现接口Iface 3.TSimpleServer服务模型 4.TThreadPoolServer 服务模型 5.TNonblockingServer 服务模型 6.THsHaServer服务模型 7.异步客户端 [一].概述 T

[转载] Thrift原理简析(JAVA)

转载自http://shift-alt-ctrl.iteye.com/blog/1987416 Apache Thrift是一个跨语言的服务框架,本质上为RPC,同时具有序列化.发序列化机制:当我们开发的service需要开放出去的时候,就会遇到跨语言调用的问题,JAVA语言开发了一个UserService用来提供获取用户信息的服务,如果服务消费端有PHP/Python/C++等,我们不可能为所有的语言都适配出相应的调用方式,有时候我们会很无奈的使用Http来作为访问协议;但是如果服务消费端不能

Struts2原理及简单实例

参考连接: http://blog.csdn.net/laner0515/article/details/27692673/ http://www.cnblogs.com/sobne/articles/5443114.html 一.Struts2原理 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就不在提了. 技术优势 Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP交换协议,The 

JSONP的诞生、原理及应用实例

问题: 页面中有一个按钮,点击之后会更新网页中的一个盒子的内容. Ajax可以很容易的满足这种无须刷新整个页面就可以实现数据变换的需求. 但是,Ajax有一个缺点,就是他不允许跨域请求资源. 如果我的代码在codepen上,我不能将我的数据放到codepen网站上,那么我只能放到我自己的服务器中,这样的话,就无法通过Ajax访问到这个数据了. 解决: 想要实现这种跨域资源请求,有很多解决办法,列举出一部分: 让服务器来加载远程数据,然后在用户请求时提供给浏览器. 用<script>或是<

Apache Thrift with Java Quickstart(thrift入门及Java实例)

thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的.高效的服务. 1. 概述 Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器.thrift允许你定义一个

thrift系列 - 多语言实例 for java和python

1.简述 本文主要介绍thrift多语言.跨语言的代码实例.Thrift对多语言的支持非常不错,定义一个thrift接口文件,通过thrift IDL compiler(代码生成引擎)生成各个语言的代码,将各自语言的代码放入各自语言的工程中,写好服务端和客户端程序,通信的问题即刻解决. 2.简单架构图 示例的thrift接口文件,test8.thrift: service TestService { string test(1: i32 num,2: string name) } 代码生成方法,

Mysql高可用复制原理及主从实例测试解析

一.Mysql复制简介 使用mysql复制功能可以将主数据的数据复制到多台从服务器上.默认情况下,采用异步传输方式,数据复制可以在各种不同的网路环境中进行.主从复制技术在企业生产中得到了广泛应用,它避免了数据库的单点故障,当一台服务器宕机,其他服务器一样可以提供稳定可靠的数据服务. 1 mysql 复制原理 Mysql复制功能是将数据分布在多个系统上,这种机制是通过将Mysql的某一台服务器(master)的数据复制到其它服务器(slaves)上来实现的.复制过程中一个服务器充当主服务器,而一个

Android安卓下拉阻尼效果实现原理及简单实例

原理  这种效果是通过自定义控件的方式来实现的,我自定义了一个控件类型,这个自定义控件(PullDownDumperLayout)继承自线性布局(LinearLayout).  用户可以下拉弹出的那个视图,例如微信的小程序列表,开发者只是将这个视图移出了父元素之外,所以不可见,我们暂且称之为隐藏头部,只有下拉到一定程度才会弹出,而主体,例如微信的联系人列表,则是可见的,布局见下图. 实现这个效果需要我们做三件工作: 隐藏作为头部的控件监听用户对屏幕的操作事件实现下拉回弹的动画效果  我们这个自定