转自:http://neoremind.com/2012/03/%E8%B7%A8%E5%B9%B3%E5%8F%B0%E9%80%9A%E4%BF%A1%E4%B8%AD%E9%97%B4%E4%BB%B6thrift%E5%AD%A6%E4%B9%A0%E3%80%90java%E7%89%88%E6%9C%AC%E3%80%91/

1. What is thrift?

Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。跨平台通信中thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。

2. thrift为我们做了什么?

首先我们需要先了解下任何RPC的解决方案都包含如下几层实现:
· 服务层(service):RPC接口定义与实现
· 协议层(protocol):RPC报文格式和数据编码格式
· 传输层(transport):实现底层的通信(如 socket)以及系统相关的功能(如事件循环、多线程)
Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk等),并由生成的代码负责RPC协议层和传输层的实现。我们只需要去实现具体的接口实现就可以了。
Thrift实际上是实现了请求响应的C/S模式,通过代码生成工具将接口定义文件生成服务器端代码,从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务便可以了。

3. thrift基本概念

数据类型

* Base Types:基本类型
* Struct:结构体类型
* Container:容器类型,即List、Set、Map
* Exception:异常类型
* Service: 定义对象的接口,和一系列方法

协议层类型

Thrift可以让你选择客户端与服务端之间传输通信协议的类别,在传输协议上总体上划分为文本(text)和二进制(binary)传输协议, 为节约带宽,提供传输效率,一般情况下
使用二进制类型的传输协议为多数,但有时会还是会使用基于文本类型的协议,这需要根据项目/产品中的实际需求:
* TBinaryProtocol – 二进制编码格式进行数据传输。
* TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
* TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
* TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
* TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。

传输层类型

* TSocket – 使用堵塞式I/O进行传输,也是最常见的模式。
* THttpTransport – 采用Http传输协议进行数据传输
* TFileTransport – 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
* TZlibTransport – 使用执行zlib压缩,不提供Java的实现。
下面几个类主要是对上面几个类地装饰(采用了装饰模式),以提高传输效率。
TBufferedTransport – 对某个Transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或者将数据直接写入buffer
TFramedTransport – 以frame为单位进行传输,非阻塞式服务中使用。同TBufferedTransport类似,也会对相关数据进行buffer,同时,它支持定长数据发送和接收。
TMemoryBuffer – 从一个缓冲区中读写数据,使用内存I/O,就好比Java中的ByteArrayOutputStream实现。

服务端类型

* TSimpleServer– 简单的单线程服务模型,常用于测试
* TThreadedServer – 多线程服务模型,使用阻塞式IO,每个请求创建一个线程。
* TThreadPoolServer – 线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求。
* TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

4. Thrift 架构

Thrift 包含一个完整的堆栈结构用于构建客户端和服务器端。下图描绘了Thrift的整体架构。
如图所示,图中黄色部分是用户实现的业务逻辑,褐色部分是根据 Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架,红色部分是根据 Thrift 文件生成代码实现数据的读写操作。红色部分以下是 Thrift 的传输体系、协议以及底层 I/O 通信,使用 Thrift 可以很方便的定义一个服务并且选择不同的传输协议和传输层而不用重新生成代码。
Thrift 服务器包含用于绑定协议和传输层的基础架构,它提供阻塞、非阻塞、单线程和多线程的模式运行在服务器上,可以配合服务器 / 容器一起运行,可以和现有的 J2EE 服务器 /Web 容器无缝的结合。

5. 安装

http://thrift.apache.org/ 官网下载,需要用ant编译成lib,最终实际项目中只需要加入如下jar包:
* libthrift.jar
* slf4j-api-1.5.8.jar
* slf4j-log4j12-1.5.8.jar
* log4j-1.2.15.jar

6. 简单实例

创建一个简单的Helloworld。首先根据Thrift的语法规范编写脚本文件Hello.thrift,代码如下:
 namespace java service.demo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void helloVoid() string helloNull() }
其中定义了服务 Hello 的五个方法,每个方法包含一个方法名,参数列表和返回类型。每个参数包括参数序号,参数类型以及参数名。
使用thrift.exe -gen java Hello.thrift生成两个gen-java文件夹,里面就有我们生成的服务器端接口Hello.java了。
创建 HelloServiceImpl.java 文件并实现 Hello.java 文件中的 Hello.Iface 接口,代码如下:
 package service.demo; import org.apache.thrift.TException; public class HelloServiceImpl implements Hello.Iface { @Override public boolean helloBoolean(boolean para) throws TException { return para; } @Override public int helloInt(int para) throws TException { try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } return para; } @Override public String helloNull() throws TException { return null; } @Override public String helloString(String para) throws TException { return para; } @Override public void helloVoid() throws TException { System.out.println("Hello World"); } }
创建服务器端实现代码,将 HelloServiceImpl 作为具体的处理器传递给 Thrift 服务器,代码如下:
 package service.server; import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TBinaryProtocol.Factory; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.transport.TServerSocket; import org.apache.thrift.transport.TTransportException; import service.demo.Hello; import service.demo.HelloServiceImpl; public class HelloServiceServer { /** * 启动 Thrift 服务器* @param args */ public static void main(String[] args) { try { // 设置服务端口为 7911 TServerSocket serverTransport = new TServerSocket(7911); // 设置协议工厂为 TBinaryProtocol.Factory Factory proFactory = new TBinaryProtocol.Factory(); // 关联处理器与 Hello 服务的实现TProcessor processor = new Hello.Processor(new HelloServiceImpl()); TServer server = new TThreadPoolServer(processor, serverTransport, proFactory); System.out.println("Start server on port 7911..."); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } } }
创建客户端实现代码,调用 Hello.client 访问服务端的逻辑实现,代码如下:
package service.client; import org.apache.thrift.TException; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import org.apache.thrift.transport.TTransportException; import service.demo.Hello; public class HelloServiceClient { /** * 调用 Hello 服务* @param args */ public static void main(String[] args) { try { // 设置调用的服务地址为本地,端口为 7911 TTransport transport = new TSocket("localhost", 7911); transport.open(); // 设置传输协议为 TBinaryProtocol TProtocol protocol = new TBinaryProtocol(transport); Hello.Client client = new Hello.Client(protocol); // 调用服务的 helloVoid 方法client.helloVoid(); transport.close(); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); } } }
 
代码编写完后运行服务器,再启动客户端调用服务 Hello 的方法 helloVoid,在服务器端的控制台窗口输出“Hello World”。

转载于:https://www.cnblogs.com/lee-mj/p/5430718.html

跨平台通信中间件thrift学习【Java版本】(转)相关推荐

  1. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(四):开源的Silverlight运行容器的编译、配置...

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  2. Tiled有java版本吗_【Cocos2d-X开发学习笔记】开发工具之Tiled地图编辑器的使用

    Cocos2D-X支持Tiled地图编辑器生成的地图数据文件.Tiled地图编辑器是一个以广泛使用为目标的地图编辑html 器,它使用简单而且能够轻松地在不一样的引擎中使用.目前最新版本使用Qt框架进 ...

  3. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(二):配置WinClient分布式运行环境...

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  4. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(三):配置ActiveXForm运行环境

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  5. 下载java哪个版本_学习JAVA应该下载ORACLE哪个版本

    学习JAVA应该下载ORACLE哪个版本 关注:290  答案:2  mip版 解决时间 2021-02-04 00:44 提问者碎情漂移ド 2021-02-03 07:52 win32_11gR1_ ...

  6. java 画笔跟swing组件_Java学习教程(基础)--Java版本历史(二)

    Java语言自JDK1.0版本以来经历了许多次更新,也在基本程序库中增加了大量的类别和包.从J2SE 1.4开始,Java语言的变动由 Java Community Process(JCP)管理,JC ...

  7. Thrift使用教程(Java版本)

    Thrift简介 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC ...

  8. AgileEAS.NET SOA 中间件平台5.2版本下载、配置学习(一):下载平台并基于直连环境运行...

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  9. 学习java 程序员技术练级攻略 作者:酷壳

    好文章要转载:http://blog.csdn.net/androidmylove/article/details/8990828 文章结束给大家来个程序员笑话:[M] 月光博客6月12日宣布了< ...

最新文章

  1. Go环境搭建、Sublime Text 3 安装Go语言相关插件gosublime
  2. 加速数据中心变革,Xilinx推出软件定义、硬件加速型 Alveo SmartNIC
  3. java小练习:.根据输入的月份,判断该月份有多少天
  4. 机器学习算法_五分钟了解机器学习十大算法
  5. 【287】◀▶ arcpy 常用类说明
  6. 物理专线流量平滑切换
  7. 推荐系统系列教程之十:协同过滤中的相似度计算方法有哪些?
  8. 5 加盐_清洗桑葚时,有人加盐有人加碱,都不对!教你正确做法,太干净了
  9. 升级插件_全新界面全面升级不能错过 摄影后期插件 CameraRaw12.3 最新版
  10. 利用系统级别的光谱成像技术分析细胞器的互作组学
  11. 移动安全:Smali语法学习示例与实践
  12. ubuntu装指定分区_Ubuntu安装过程中如何手动指定分区
  13. matlab批量裁剪图像并保存,matlab批量裁剪tif图片
  14. 如何利用福禄克OFP2-100-Q CH测试光纤的熔接损耗
  15. java.sql.BatchUpdateException: Data truncation: Division by 0
  16. 我的-Android-面试故事---13家面试记录,附面试答案,android星座查询源码
  17. vue中使用h5 video标签实现弹窗播放本地视频
  18. 在html页面添加了评论和回复的显示页面
  19. 分享应用于桌面闹钟的超低成本MG127蓝牙射频前端芯片
  20. Samba之打印机共享配置nbsp;(CUPS…

热门文章

  1. Cocosd-x”设计模式“之五 :防御式编程”模式“
  2. 俺的房子内有空调冬暖夏凉,房间宽敞气派非凡
  3. L1-072 刮刮彩票 (20 分)-PAT 团体程序设计天梯赛 GPLT
  4. 蓝桥杯 ALGO-148 算法训练 5-1最小公倍数 java版
  5. LeetCode 46. Permutations
  6. 1005. 继续(3n+1)猜想 (25) PAT乙级真题
  7. c语言中cnthe普通变量,不得不说,关于 *(unsigned long *) 和 (unsigned long)
  8. 知名的开源apm(Application Performance Management)工具
  9. 按编译原理的思路设计的一个计算器
  10. 百度App网络深度优化系列(一):DNS优化