Apache Thrift 介绍

线上问题排查系列-org.apache.thrift.transport.TTransportException:java.net.SocketTimeoutExceptio 大数据作业异常的排查,往往是个比较棘手的问题。这一方便是因为分布式作业的执行往往需要跨多个网络节点进行通信比较复杂,另一方面也是因为涉及底层框架多(spark, hive, flink, ... 阅读详情

Apache Thrift简介

Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言,例如:  C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多种不同的语言之间通信thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。Thrift适用于程序对程 序静态的数据交换,需要先确定好他的数据结构,他是完全静态化的,当数据结构发生变化时,必须重新编辑IDL文件,代码生成,再编译载入的流程,跟其他IDL工具相比较可以视为是Thrift的弱项,Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相对于JSON和xml无论在性能、传输大小上有明显的优势。

Thrift如何使用

本文基于thrift最新版本0.6.1。

首先呢,Thrift使用了ThriftIDL来定义服务器和客户端的接口。例如,这是本文使用的一个thrift(calculator.thrift)文件。

 

namespace java calculator
 
/*
Thrift的注释与C++或Java类似
*/
 
/*
在这里我们定义了加减乘除的一个枚举类型
*/
enum Operation {
  ADD,
  SUBTRACT,
  MULTIPLY,
  DIVIDE
}
 
/*
Thrift支持自定义的异常
*/
exception InvalidOperation {
  1: i32 errorCode,
  2: string message
}
 
/*
定义一下我们的Service接口
*/
service Calculator {
 
   i32 calculate(1:Operation operation, 2:i32 num1, 3:i32 num2) throws (1:InvalidOperation e),
}
 

 

接下来,我们需要把这个thrift文件编译成Java文件。

我们需要的编译工作可以到http://thrift.apache.org/download/下载:Thrift compiler for Windows (thrift-0.6.1.exe) 。千万不要下载“Snapshot Releases”的,这个不一定能用,我就下错了,结果无法使用,呵呵。

接下来我们运行命令

thrift-0.6.1.exe -o src --gen java calculator.thrift

可以看到在src目录下生成了如下的文件

 

gen-java\calculator\Calculator.java
gen-java\calculator\InvalidOperation.java
gen-java\calculator\Operation.java

 

把这几个文件加入到你的项目中吧。

下面,我们需要thrift的Java库。

使用maven或ivy的可以参考http://mvnrepository.com/artifact/org.apache.thrift/libthrift/0.6.1进行下载

thrift没有提供完整的下载,不过既然是搞Java的,起码要会maven或ivy吧。

实在不行,就去http://svn.apache.org/repos/asf/thrift/trunk/lib/java/下载源代码,然后运行一下ant就ok啦。

到这里我们已经准备好了thrift。

我们看一下thrift的架构

thrift最大的功劳就在于他帮助我们实现了传输层(TTransport)和协议层(TProtocol),我们只需要选择需要一个适合自己的实现就ok啦。

例如,我们客户端可以这么写

package calculator;

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;

public class Client {

	public static void main(String[] args) {
		// 传输层
		// * TSocket- 使用堵塞式I/O进行传输,也是最常见的模式。
		// * TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。
		// * TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
		// * TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。
		// * TZlibTransport- 使用执行zlib压缩,不提供Java的实现。
		TTransport transport = new TSocket("localhost", 9090);

		// 协议层
		// * TBinaryProtocol – 二进制编码格式进行数据传输。
		// * TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity
		// (VLQ)编码对数据进行压缩。
		// * TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
		// * TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
		TProtocol protocol = new TBinaryProtocol(transport);

		Calculator.Client client = new Calculator.Client(protocol);

		try {
			transport.open();

			System.out.println(client.calculate(Operation.ADD, 1, 2));
			System.out.println(client.calculate(Operation.SUBTRACT, 3, 5));
			System.out.println(client.calculate(Operation.MULTIPLY, 4, 2));
			System.out.println(client.calculate(Operation.DIVIDE, 1, 0));

		} catch (TTransportException e) {
			e.printStackTrace();
		} catch (InvalidOperation e) {
			e.printStackTrace();
		} catch (TException e) {
			e.printStackTrace();
		} finally {
			// 最后一定要调用close来释放资源
			transport.close();
		}

	}
}


这个客户端很简单,设置一个传输层(TTransport)和协议层(TProtocol)的实现类TSocket和TBinaryProtocol,就可以使用thrift帮我们生成的类alculator.Client(这个完全不用我们写一行代码的,自动生成的类)来调用服务器上的真正的Calculator对象了,用起来跟直接调用函数差不多,把网络传输细节都隐藏起来了。

下面我们看一下服务器的实现。

package calculator;

import org.apache.thrift.TException;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TServerTransport;
import org.apache.thrift.transport.TTransportException;

public class Server {

	/*
	 * 在服务器这边,由这个类来真正处理客户端的请求。
	 */
	public static class CalculatorHandler implements Calculator.Iface {

		@Override
		public int calculate(Operation operation, int num1, int num2)
				throws InvalidOperation, TException {
			switch (operation) {
			case ADD:
				return num1 + num2;
			case SUBTRACT:
				return num1 - num2;
			case MULTIPLY:
				return num1 * num2;
			case DIVIDE:
				if (num2 == 0) {
					throw new InvalidOperation(1, "divide by zero");
				}
				return num1 / num2;
			default:
				throw new InvalidOperation(0, "impossible code");
			}
		}

	}

	public static void main(String[] args) {

		// 既然是RPC,那么我们在服务器需要有一个真正的类来处理客户端的请求
		Calculator.Processor processor = new Calculator.Processor(
				new CalculatorHandler());

		try {
			TServerTransport serverTransport = new TServerSocket(9090);

			// 服务端类型
			// * TSimpleServer - 单线程服务器端使用标准的堵塞式I/O。
			// * TThreadPoolServer - 多线程服务器端使用标准的堵塞式I/O。
			// * TNonblockingServer – 多线程服务器端使用非堵塞式I/O,并且实现了Java中的NIO通道。
			TServer server = new TSimpleServer(
					new TServer.Args(serverTransport).processor(processor));
			
			server.serve();

			// 跟Client的写法比起来,是不是觉得少了TProtocol?
			// 因为TServer.Args默认设置的TProtocol是TBinaryProtocol,因此就不显示指定了。

		} catch (TTransportException e) {
			e.printStackTrace();
		}

	}
}


服务器的实现也一样,设置一个传输层(TTransport)和协议层(TProtocol)的实现类TSocket和TBinaryProtocol,然后直接调用TServer的serve函数就ok了。之后服务器就挂起等待客户端的请求了。

当然,我们还需要在服务器这边写一个真正的CalculatorHandler实例。这个实例在服务器这边进行真正的计算,然后有TServer自动地把结果传递给client。

Thrift比起protobuf的优点

protobuf也提供了跨语言的数据传输解决方案,但是没有thrift的server和client的功能。使用protobuf实现server和client需要自己编写网络传输的代码(缺少thrift的TTransport和TProtocol这两层的实现)。另外,protobuf只支持c++,python,java,语言数量比较少。Thrift支持C++, C#, Erlang, Haskell, Java, Objective C/Cocoa, OCaml, Perl, PHP, Python, Ruby, and Squeak等各种听过或没听过的语言^_^。当然protobuf优势在于传输的数据比thrift小一些,当然差距不是很大。另外,事实上protobuf完全可以实现server/client功能,从protobuf的service功能可以看出来,不知道为什么google没有实现,而是留给用户去实现。

参考资源

http://www.javabloger.com/article/apache-thrift-architecture.html

http://en.wikipedia.org/wiki/Apache_Thrift

http://thrift.apache.org/

http://wiki.apache.org/thrift/

最新CobaltStrike4.8/CobaltStrike4.9、CS4.9/CS4.8、 Windows/Linux/Mac版下载 Cobalt Strike是一款基于java的渗透测试神器,常被业界人称为CS神器。自3.0以后已经不在使用Metasploit框架而作为一个独立的平台使用,分为客户端与服务端,服务端是一个,客户端可以有多个,非常适合团队协同作战,多个攻击者可以同时连接到一个团队服务器上,共享攻击资源与目标信息和sessions,可模拟APT做模拟对抗,进行内网渗透。 Cobalt Strike集成了端口转发、服务扫描,自动化溢出,多模式端口监听,win exe木马生成,win dll木马生成,java木马生成, 阅读详情

相关推荐

驯服电源尖峰:从BUCK/BOOST环路剖析到高di/dt噪声的实战抑制

本文深入探讨了电源系统中高di/dt噪声的产生机制及抑制方法,通过BUCK/BOOST电路的环路分析,揭示了电流路径不连续导致的电压尖峰问题。文章提供了实用的PCB布局技巧和噪声抑制策略,包括最短回路原则、铺铜优化和过孔阵列战术,帮助工程师有效降低EMI噪声,提升电源系统的稳定性。

weixin_29587015的博客 275

Java Error org.apache.thrift.transport.TTransportException

  org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused: connect   org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refus...

一只菜鸡 1万+

【论文精读】Latent Diffusion

Latent Diffusion

weixin_44934783的博客 4478

Hive之metastore服务启动错误解决方案org.apache.thrift.transport.TTransportException: Could not create ServerSock

Hive之metastore服务启动错误解决方案——org.apache.thrift.transport.TTransportException: Could not create ServerSocket on address 0.0.0.0/0.0.0.0:9083. 1、错误 org.apache.thrift.transport.TTransportException: Could no...

weixin_45568892的博客 1万+

一文读懂GPU通信互联技术:GPUDirect、NVLink与RDMA

GPUDirect是NVIDIA开发的一项技术,旨在实现GPU与其他设备(如网络接口卡NIC和存储设备)之间的直接通信和数据传输,而无需CPU的参与。传统上,数据在GPU和另一个设备之间传输时,必须通过CPU,这导致潜在的性能瓶颈和延迟增加。GPUDirect技术则通过绕过CPU,直接访问和传输数据,显著提高系统性能。NVLink是NVIDIA开发的一种高速、高带宽的互连技术,用于连接多个GPU之间或GPU与其他设备(如CPU、内存等)之间的通信。

异构算力老群群(在读985计算机博士生)的技术博客 7777

比亚迪璇玑架构:10ms级响应引领智能驾驶革命

比亚迪璇玑架构通过三大创新,实现10ms级控制响应时延,使AEB刹车距离比竞品缩短20米。

百态·数智思维 | 聚焦大数据、量化与未来AI 1257

Java调用Thrift接口时报错:org.apache.thrift.transport.TTransportException: Socket is closed by peer

我首先检查了是否真的被我close了,经确认,并没有。 然后往上各种搜,最终发现是与服务端协议不同导致的,报错的代码是缺少下方红框中的代码,加上后就可以调通了。

Fight攻城狮 1万+

一步一步教你如何安装IP-Guard(客户端WINDOWS篇)

1、安装完服务器后,在服务器右下角有一个IP-GUARD图标:如图 2、点图标右键选注册: 3、注册成功后, 4、在开始菜单里选生成客户端安装包。 5、生成客户端安装包成功,安装名字可以任意,但是最好是英文名字。 6、将客户端安装程序复制到桌面。 7、退出所有杀毒软件、安全卫士、电脑管家等然后运行 8、安装完成后,立即重启计算机。IPguard客户端安装完成。 9、这样在控制里就可以看到已经安装客户端的计算机,在线显示蓝色,灰色表示计算机已经离线货关机 ...

IP-Guard专栏 5630

Apache Thrift介绍

文章目录1、简介2、Thrift IDL2.1、基本类型2.2、结构体struct2.3、容器Container2.4、枚举enum2.5、常量定义2.6、类型定义2.7、异常Exception2.8、服务定义类型Service2.9、名字空间NameSpace2.10、注释Comment2.11、include 1、简介 thrift官网 Apache Thrift软件框架用于可伸缩的跨语言服务...

weixin_44240370的博客 1440

深度学习论文: Towards Total Recall in Industrial Anomaly Detection

在大规模工业制造中,能够准确检测出有缺陷的零件至关重要。我们在这项工作中面临的一个特殊挑战是冷启动问题:仅使用正常的示例图像来训练模型。虽然可以针对每个类别手动设计解决方案,但我们的目标是构建能够自动适用于多个任务的系统。最佳的方法是将ImageNet模型的嵌入特征与异常检测模型结合起来。在本文中,我们在这一研究基础上进行了扩展,并提出了PatchCore,它利用了一个具有最大代表性的正常补丁特征内存库。通过这种方法,我们能够更好地解决冷启动问题,并提高系统在多任务上的性能。

mingo_敏 1880

人像美肤 人体美型 CVPR 2022 ABPN

人像美肤 CVPR 2022 ABPN

jacke121的专栏 841

Apache Thrift基本使用介绍

基本介绍 Thrift 是用于点对点 RPC 实现的轻量级、独立于语言的软件堆栈。 Thrift 为数据传输、数据序列化和应用程序级处理提供了清晰的抽象和实现。 代码生成系统将简单的定义语言作为输入,并生成跨编程语言的代码,这些编程语言使用抽象堆栈来构建可互操作的 RPC 客户端和服务器。 Thrift 使以不同编程语言编写的程序可以轻松共享数据和调用远程过程。 Thrift 支持 28 种编程语言,很有可能支持您当前使用的语言。 Thrift 专门设计用于支持跨客户端和服务器代码的非原子版本更改。 这使

从大数据到人工智能的博客 1298

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Apache顶级项目介绍9-Thrift

年末最后一弹,我们来简单介绍一下Apache顶级项目Thrift并尝试了解其内部实现机制。 1. Thrift介绍 Thrift最初是由Facebook操刀实现的一个内部项目,主要用于Facebook内部各系统之间的RPC调用。2007年开源,2008年进入Apache孵化器,现在是Apache顶级项目之一。 官网极简,文档匮乏,简直不忍直视。 官网介绍Thrift是一个可

ErixHao的专栏 2866

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Apache Thrift介绍及安装

1.Thrift是FaceBook开源出的一种高效的,支持多种编程语言的远程过程调用框架。其数据传输采用二进制格式,相对于XML和JSON体积小,对于高并发,大数据量和多语言的情况下更加有优势。Thrift通过一个中间语言(IDL,接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java,Python,PHP,Ruby,Erla...

djm82755的博客 188

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Apache Thrift的简单介绍

1.什么是Thrift thrift是一种可伸缩的跨语言服务的发展软件框架。它结合了功能强大的软件堆栈的代码生成引擎,以建设服务。不同开发语言开发的服务可以通过该框架实现通信。 thrift是facebook开发的,创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性。所 以thrift可以支持多种程序语言,例如:C++, ...

weixin_30685047的博客 114

Apache Thrift基本介绍

1、概述经过了详细的信息格式、网络IO模型的讲解,并且通过JAVA RMI的讲解进行了预热。从这篇文章开始我们将进入这个系列博文的另一个重点知识体系的讲解:RPC。在后续的几篇文章中,我们首先讲解RPC的基本概念,一个具体的RPC实现会有哪些基本要素构成,然后我们详细介绍一款典型的RPC框架:Apache Thrift。接下来我们聊聊服务治理和DUBBO服务框架。最后总结一下如何在实际工作中选择合...

We_are_family678的博客 818

apache thrift介绍与实例

thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Go,Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js,thrift最初由facebook开发用做系统内各语言之间的RPC通信 。   2007年由facebo

kingxuexi的博客 416

Apache Thrift 介绍与开发

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

JIESA的专栏 691

Apache Thrift入门1-架构&介绍

Thrift 是什么? Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言,例如: C++, C#, C...

weixin_34115824的博客 82

【转】Apache Thrift入门1-架构&介绍

Thrift  是什么?  Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言,例如:  C++, C#, Cocoa, Erlang...

topMan'blog 119
上一篇: redis 安装说明(windows linux)
下一篇: SiteMesh介绍
johnnydev
博客等级 码龄15年 16粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值