thrift框架分析.docx
- 文档编号:20702864
- 上传时间:2023-04-25
- 格式:DOCX
- 页数:10
- 大小:286.13KB
thrift框架分析.docx
《thrift框架分析.docx》由会员分享,可在线阅读,更多相关《thrift框架分析.docx(10页珍藏版)》请在冰豆网上搜索。
thrift框架分析
Thrift框架分析1
分类:
数据库2010-11-0217:
531646人阅读评论(0)收藏举报
本文先整体性地介绍Thrift框架,然后分析Thrift源码中自带的toturial例子,作为Thrift的入门吧。
一.Thrift介绍
Thrfit是一种开源的跨语言的服务部署框架,这里的服务是指RPC,即远程过程调用了。
它最初是由Facebook开发的,后来Facebook将其开源了。
因此你可以很方便地下载到它的源代码,下载地址为:
http:
//incubator.apache.org/thrift/download/
Thrift的体系架构如下:
实际上Thrift提供了一个支持多语言的Lib库,包括C++、Java、PHP、Python、Ruby等。
同时它自定义了一种中间语言(ThriftIDL),
用于编写统一格式的thrift配置文件,定义数据类型。
然后根据此配置文件调用lib库中的生成器来生成指定语言的服务,这正体现其跨语言的特性。
Thrift支持五种数据类型:
BaseTypes:
基本类型
Struct:
结构体类型
Container:
容器类型,即List、Set、Map
Exception:
异常类型
Service:
类似于面向对象的接口定义,里面包含一系列的方法
下面是Thrift中所支持的类型(前三种类型)
Thrift通过两种抽象机制来完成底层客户端和服务器端的通信,分别是:
1) Transport:
抽象了底层网络通信部分的接口
TTransport对JavaI/O层进行封装,抽象了底层网络通信部分的接口。
主要是对以下6种接口进行了抽象:
open,close,isopen,read,write,flush。
2) Protocol:
抽象了对象在网络中传输部分的接口,它规定了thrift的RPC可以调用的接口。
这些接口是为了传输不同类型的数据而设计的。
Transport在传输数据时是不区分所传的数据类型的,一律以流的形式传输。
所以Protocol类在Transport类之上实现了按数据类型来传输数据。
Transport的类结构实现:
socket的封装
TTransport是一个抽象的基类,对socket进行了封装,提供了对流的一系列操作接口。
thrift提供了两种常用类型的Socket,一种是阻塞式的,两外一种是非阻塞式的。
这两种socket的区别实际上就是传统IO和NIO的区别,这里就不累述了。
通过close()和open()来建立和关闭连接;通过read()和write()来对流进行读写。
ServerSocket的封装
TServerSocket同样是一个抽象的基类,对ServerSocket进行了封装。
它是以非阻塞的IO方式进行通讯的。
通过listen()来监听连接请求,通过accept()来获取。
Protocol的类结构实现:
TProtocol提供了一系列按类型进行读写的接口。
并持有一个TTransport对象的引用,所以TProtocol类是依赖于TTransport类的。
其中定义了一系列的write和read方法,应该说每种类型对应一套write和read方法。
在write和read方法中会分别调用TTransport
中的write和read方法进行实际的读写操作。
RPC的具体实现:
1.TProcessor
它是thrift中最简单的一个接口了,仅包含一个方法:
boolprocess(TProtocolin,TProtocolout)throwsTException
此方法有两个参数in和out,分别用于从socket中读取数据和向scoket中写数据。
每个service对象中都会包含一个实现了此接口的类对象(Process),
这个类就是处理RPC请求的核心。
2.TServer
TServer相当于一个容器,拥有生产TProcessor、TTransport、TProtocol的工厂对象。
它的工作流如下:
1) 使用TServerTransport来获取一个TTransport(客户端的连接)
2) 使用TTransportFactory来将获取到的原始的transport转化为特定的transport
3) 使用TProtocolFactory来为获取TTransport的输入输出,即TProtocol
4) 唤醒TProcessor的process方法,处理请求并返回结果
二.tutorial分析
现在结合一个例子来研究如何应用Thrift。
例子就是thrift源代码中自带的tutorial,测试语言方面则选择java。
在此之前,必须安装好Thrift,安装过程就不累述了,可以参考thrift中的readme文件。
1.我们可以使用Ant工具将thrift的javalib打包成jar文件,这样可以直接导入Eclipse使用。
进入到tutorial根目录,里面有两个文件.thrift,这就是上面讲到的配置文件了,里面定义了我们要提供的服务。
下面是其中的一个文件的内容:
+expandsourceviewplaincopytoclipboardprint?
2.输入如下命令生成代码:
thrift-r--gen javatutorial.thrift
完成后,会发现多了一个gen-java的文件夹,这就是生成的代码。
我们看下代码结构:
两个service类(ShareService和Calculator)均包含两个内部类:
Client和Processor,前者用于客户端,后者用于服务器端。
这两个类均包含一套service方法的实现(ping、add、calculate、zip),RPC就是基于这套共用方法实现的。
3.经过上面的两步,我们得到了两个jar文件,libthrift.jar和tutorial.jar,至此环境已经部署完成。
分别运行JavaServer和JavaClient,开启服务器端
和客户端,观察运行结果。
JavaServer.java
+expandsourceviewplaincopytoclipboardprint?
JavaClient.java
+expandsourceviewplaincopytoclipboardprint?
ping()的序列图:
4.当然,我们可以使用不同语言的客户端和服务器端。
例如:
我们可以将客户端换成php语言的。
1)进入到tutorial根目录,执行如下命令:
thrift--genphpshared.thrift thrift--genphptutorial.thrift
完成后会发现多了一个gen-php目录。
2)启动java服务器端,方法同上。
3)启动php客户端,观察测试结果。
PS:
我的服务器端运行在Windows系统中,直接将生成的libthrift.jar和tutorial.jar导入到Eclipse中,然后运行JavaServer文件即可。
而客户端呢我是运行在虚拟机的Ubuntu系统中,启动客户端前需安装php(apt-getinstallphp5)。
同时,修改PhpClient.php中的ip为宿主机的ip。
最后,输入如下命令启动:
phpPhpClient.php。
通过输出显示,客户端和服务器端的语言不影响执行的结果,这正是thrift的跨语言性。
Reference:
http:
//incubator.apache.org/thrift/static/thrift-20070401.pdf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- thrift 框架 分析