目前流行的服务调用方式有很多种,例如基于 SOAP 消息格式的 Web Service,基于 JSON 消息格式的 RESTful 服务等。其中所用到的数据传输方式包括 XML,JSON 等,然而 XML 相对体积太大,传输效率低,JSON 体积较小,新颖,但还不够完善。本文将介绍由 Facebook 开发的远程服务调用框架 Apache Thrift,它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。本文将详细介绍 Thrift 的使用,并且提供丰富的实例代码加以解释说明,帮助使用者快速构建服务
-----------------------------------分割线----------------------------------------------------------------
1.下载thrift,我们这里下载最新的0.9.0的windows版本。
2. 进入thrift的目录,定义服务描述文件,thrift的服务描述文件以thrift结尾,类似于web services的wsdl文件。thrift提供了丰富的数据接口用于不同语言之间的服务需求。其数据结构如下
Base Types:基本类型
bool:布尔值,true 或 false,对应 Java 的 boolean
byte:8 位有符号整数,对应 Java 的 byte
i16:16 位有符号整数,对应 Java 的 short
i32:32 位有符号整数,对应 Java 的 int
i64:64 位有符号整数,对应 Java 的 long
double:64 位浮点数,对应 Java 的 double
string:未知编码文本或二进制字符串,对应 Java 的 String
Struct:结构体类型
Container:容器类型,即List、Set、Map
Exception:异常类型
Service: 定义对象的接口,和一系列方法
我们测试定义个叫做Test的服务,其右一个ping方法用户传输一个int32类型的数据。其thrift文件描述如下
namespace java net.johnc.thrift service Test{ void ping(1: i32 length) }
可以看到定义了一个叫做Test的服务,并定义了相关方法,其中1:用户标识参数的编号。
3. 进入thrift的目录,运行$ thrift -r --gen java test.thrift // -r对其中include的文件也生成服务代码 -gen是生成服务代码的语言,此时进入$gen-java的目录下就可以看到生成对应的java文件,该文件即是相应服务端和客户端的实现【其实此处也类似于web services中通过wsdl生成相应代码的情况】。
4.编写客户端
TTransport transport; try { transport = new TSocket("localhost", 1234); TProtocol protocol = new TBinaryProtocol(transport); Test.Client client = new Test.Client(protocol); transport.open(); client.ping(2012); transport.close(); } catch (TTransportException e) { e.printStackTrace(); } catch (TException e) { e.printStackTrace(); }
如上所示:客户端像服务端调用ping方法,发送2012这个数值
5.编写服务端
服务实现类TestImpl
public class TestImpl implements Test.Iface{ public void ping(int length) throws TException { System.out.println("client length:"+length); } }
服务启动类Server
public class Server { public void startServer() { try { TServerSocket serverTransport = new TServerSocket(1234); Test.Processor process = new Processor(new TestImpl()); Factory portFactory = new TBinaryProtocol.Factory(true, true); Args args = new Args(serverTransport); args.processor(process); args.protocolFactory(portFactory); TServer server = new TThreadPoolServer(args); server.serve(); } catch (TTransportException e) { e.printStackTrace(); } } public static void main(String[] args) { Server server = new Server(); server.startServer(); } }
6.分别启动服务端和客户端,即可实现客户端向服务端发送int数值的效果
从例子中可以看出,thrift的工作流程
FooServeice:是由服务描述文件.thrift 生成而来,不同的语言可以生成不同版本,thrift目前已经支持C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk等语言(本例中都是以java为例子)
Foo.read()/writer():在服务的下一层提供基础的读写方法,客户端可以向服务端写数据,也可以从服务端接收数据,服务端可以向客户端写数据,也可以向客户端读取数据。
Foo.read()/writer():在服务的下一层提供基础的读写方法,客户端可以向服务端写数据,也可以从服务端接收数据,服务端可以向客户端写数据,也可以向客户端读取数据。
TProcotol:传输协议层,thrift提供了丰富的传输协议,主要包含如下:
TBinaryProtocol – 二进制编码格式进行数据传输。
TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。
TTransport:
TSocket- 使用堵塞式I/O进行传输,也是最常见的模式。
TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。
TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。
TZlibTransport- 使用执行zlib压缩,不提供Java的实现。
服务端在处理客户端请求上也提供多种的模式,包括如下
TSimpleServer:单线程阻塞方式
TThreadPoolServer:多线程阻塞方式
TNonblockingServer:非阻塞的方式以块传输数据
--------------------------------------------------分割线-------------------------------------------------------------
性能测试
协议传输量对比
协议耗费资源对比
相关推荐
Apache Thrift——可伸缩的跨语言服务开发框架 Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程...Apache Thrift 是一种功能强大且灵活的跨语言服务开发框架,适合开发高效的、可扩展的远程服务调用应用。
2. **高性能**:Thrift的二进制协议和高效的数据序列化方式使得通信速度较快,适合大数据量和高并发的场景。 3. **轻量级**:Thrift的API设计简洁,易于理解和使用,同时它不依赖特定的框架或库,降低了系统的复杂...
Thrift 是一个开源的跨语言...通过这种方式,Thrift简化了分布式系统之间的通信,并提供了高性能、可扩展的解决方案。对于Java开发者来说,理解并掌握Thrift的使用,将有助于构建更加高效和可维护的跨平台应用程序。
Thrift是一种开源的跨语言服务开发框架,由Facebook开发并贡献给了Apache基金会。它被设计用来高效地构建可扩展的服务,允许用...掌握Thrift的使用,能帮助开发者轻松地在.NET C#环境下构建可扩展的、高性能的服务。
Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年开发并开源,其设计目标是高效、简洁地构建可扩展的...通过理解并熟练掌握Thrift,开发者可以构建出跨平台、高性能的网络服务,提高系统的可扩展性和维护性。
Thrift是由Facebook开源的一个高性能、可扩展的跨语言服务开发框架。它的主要功能包括自动生成服务接口、客户端和服务器端代码,简化了服务之间的通信。 本文将详细讲解基于Thrift的RPC框架,并重点介绍如何在其...
这个版本的Thrift提供了一种高效、灵活且可扩展的方式来构建分布式系统。Thrift的核心理念是通过定义一种中间描述语言(IDL,Interface Definition Language)来指定服务接口,然后自动生成不同编程语言的客户端和...
2. **高性能通信**:Thrift-Laravel利用Thrift的高效序列化和反序列化机制,实现快速的数据交换,尤其适合大数据量和高并发场景。 3. **多语言支持**:由于Thrift支持多种语言,使用Thrift-Laravel可以轻松地在...
Thrift是一种高性能的跨语言服务框架,由Facebook于2007年开发并开源,现已成为Apache软件基金会的顶级项目。它的主要目标是解决分布式系统中的通信问题,通过提供一套代码生成工具,使得开发者可以方便地在不同的...
服务化是一种将大型复杂系统分解为多个小型、独立的服务的架构模式,这种模式有助于提高系统的可维护性、可扩展性和灵活性。PHP高性能服务化框架,如PSF(PHP Service Framework),是针对PHP编程语言设计的一种解决...
Dubbo是阿里巴巴开源的一个高性能、轻量级的Java服务治理框架,它专注于服务的暴露、调用、监控和治理。Thrift的原生协议是二进制的,相比HTTP等文本协议更高效,因此在性能要求较高的场景下,选择Thrift作为通信...
服务化框架在现代软件开发中扮演着重要角色,它使得复杂系统能够被拆分为可独立部署、可扩展的服务。阿里巴巴的HSF和dubbo、Facebook的thrift、Google的grpc以及Twitter的finagle都是业界知名的RPC框架。然而,PHP...
Thrift是由Facebook开源的一种高性能的RPC(Remote Procedure Call)框架,它能够将服务定义为接口,然后自动生成多种编程语言的客户端和服务端代码,使得不同语言之间可以方便地进行数据交换。 首先,我们需要理解...
Thrift是Facebook开源的一款高性能、跨语言的服务框架,它的设计目标是高效地在不同编程语言之间进行通信。本文将基于Thrift的Java实现,总结学习过程中的一些关键知识点,旨在帮助理解Thrift的工作原理以及如何在...
而 Thrift 是一个跨语言的服务框架,它提供了编译器和运行时库,可以方便地创建高性能、可扩展的服务。 【描述】"供大家使用" 表明这个 demo 是为了提供给开发者们参考和学习,帮助他们理解如何在自己的项目中运用 ...
在IT领域,选择合适的RPC(远程过程调用)框架对于系统的性能和可扩展性至关重要。本文主要分析了四种常见的RPC框架——ice、dubbo、thrift和grpc的性能表现,通过一组简化的并发测试,对比了它们在不同并发情况下的...
2. **高性能**:Thrift使用高效的二进制协议进行序列化和通信,相比XML或JSON,数据传输更紧凑,性能更好。 3. **易于使用**:通过简单的IDL定义,可以快速地在各种语言间建立通信接口。 4. **轻量级**:Thrift...
总之,workerman-thrift结合了Thrift的跨语言RPC能力和Workerman的高性能网络通信框架,为PHP开发者提供了一套强大、易用的解决方案,有助于构建高效、可扩展的分布式系统。通过熟练掌握和实践,开发者可以极大地...
Apache Thrift是一个强大的开源框架,它允许开发人员在多种编程语言之间进行高效的远程过程调用(RPC)...通过学习和掌握Thrift,你可以创建可扩展、高效率的服务,实现跨语言的服务调用,提高系统的灵活性和可维护性。
它主要用于构建可扩展且高性能的服务,允许使用多种编程语言来实现服务的客户端和服务器端。Thrift通过定义一种中间表示(IDL,接口定义语言)来描述服务,然后自动生成对应语言的代码,使得开发者可以轻松地在不同...