首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 服务器 > Apache >

Apache Thrift - 可舒卷的跨语言服务开发框架

2013-12-11 
Apache Thrift - 可伸缩的跨语言服务开发框架转载自:http://www.ibm.com/developerworks/cn/java/j-lo-apa

Apache Thrift - 可伸缩的跨语言服务开发框架

转载自:http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/

?

?

简介:?Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。本文将从 Java 开发人员角度详细介绍 Apache Thrift 的架构、开发和部署,并且针对不同的传输协议和服务类型给出相应的 Java 实例,同时详细介绍 Thrift 异步客户端的实现,最后提出使用 Thrift 需要注意的事项。

如图所示,图中黄色部分是用户实现的业务逻辑,褐色部分是根据 Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架,红色部分是根据 Thrift 文件生成代码实现数据的读写操作。红色部分以下是 Thrift 的传输体系、协议以及底层 I/O 通信,使用 Thrift 可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重新生成代码。

Thrift 服务器包含用于绑定协议和传输层的基础架构,它提供阻塞、非阻塞、单线程和多线程的模式运行在服务器上,可以配合服务器 / 容器一起运行,可以和现有的 J2EE 服务器 /Web 容器无缝的结合。

服务端和客户端具体的调用流程如下:


图 2. Server 端启动、服务时序图(查看大图)
Apache Thrift - 可舒卷的跨语言服务开发框架

该图所示是 HelloServiceServer 启动的过程以及服务被客户端调用时,服务器的响应过程。从图中我们可以看到,程序调用了 TThreadPoolServer 的 serve 方法后,server 进入阻塞监听状态,其阻塞在 TServerSocket 的 accept 方法上。当接收到来自客户端的消息后,服务器发起一个新线程处理这个消息请求,原线程再次进入阻塞状态。在新线程中,服务器通过 TBinaryProtocol 协议读取消息内容,调用 HelloServiceImpl 的 helloVoid 方法,并将结果写入 helloVoid_result 中传回客户端。


图 3. Client 端调用服务时序图(查看大图)
Apache Thrift - 可舒卷的跨语言服务开发框架

该图所示是 HelloServiceClient 调用服务的过程以及接收到服务器端的返回值后处理结果的过程。从图中我们可以看到,程序调用了 Hello.Client 的 helloVoid 方法,在 helloVoid 方法中,通过 send_helloVoid 方法发送对服务的调用请求,通过 recv_helloVoid 方法接收服务处理请求后返回的结果。

为了处理返回 null 值情况,我们要捕获该异常,并进行相应的处理,具体客户端代码实现如下:


清单 16. 处理服务返回值为 null 的代码

从图中我们可以看到,客户端和服务器端部署时,需要用到公共的 jar 包和 java 文件,如图“Common file”区域,其中 Hello.java 由 Hello.thrift 编译而来。在服务器端,服务必须实现 Hello.Iface 接口,同时要包括服务器的启动代码 HelloServiceServer.java。在客户端,包括客户端调用服务的代码 HelloServiceClient.java。客户端和服务器通过 Hello.java 提供的 API 实现远程服务调用。

总结

本文介绍了 Apache Thrift 的安装部署和架构,并通过大量实例介绍了在不同情况下如何使用 Apache Thrift 来构建服务,同时着重介绍了 Thrift 异步客户端的构建,希望能给读者带来一些帮助。

?

参考资料

学习

Apache Thrift 官网:可下载 Thrift 工具和源码。

Thrift Features and Non-features:Thrift 的功能特点和不足之处。

Apache Thrift 介绍:介绍 Thrift 架构、协议、传输层和服务端类型,并与其他构建服务的方法 ( 如:REST) 进行比较分析。

Thrift 的安装部署:Thrift 的安装部署说明

Thrift: Scalable Cross-Language Services Implementation:Thrift 官方文档,详细介绍 Thrift 的设计

Thrift API:关于 Apache Thrift 0.6.1 构建服务端和客户端的 API 手册

Thrift 实例:Thrift 的简单应用实例

Fully async Thrift client in Java:关于 Thrift 异步客户端的介绍

developerWorks Java 技术专区:这里有数百篇关于 Java 编程各个方面的文章。

热点排行