`
DAOException
  • 浏览: 122204 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Thrift可扩展高性能的通信服务框架

 
阅读更多

         目前流行的服务调用方式有很多种,例如基于 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——可伸缩的跨语言服务开发框架 Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程...Apache Thrift 是一种功能强大且灵活的跨语言服务开发框架,适合开发高效的、可扩展的远程服务调用应用。

    Apache Thrift - 可伸缩的跨语言服务开发框架(代码已修正)

    2. **高性能**:Thrift的二进制协议和高效的数据序列化方式使得通信速度较快,适合大数据量和高并发的场景。 3. **轻量级**:Thrift的API设计简洁,易于理解和使用,同时它不依赖特定的框架或库,降低了系统的复杂...

    Thrift Java 服务器 客户端通信

    Thrift 是一个开源的跨语言...通过这种方式,Thrift简化了分布式系统之间的通信,并提供了高性能、可扩展的解决方案。对于Java开发者来说,理解并掌握Thrift的使用,将有助于构建更加高效和可维护的跨平台应用程序。

    Thrift初探:简单实现C#通讯服务程序

    Thrift是一种开源的跨语言服务开发框架,由Facebook开发并贡献给了Apache基金会。它被设计用来高效地构建可扩展的服务,允许用...掌握Thrift的使用,能帮助开发者轻松地在.NET C#环境下构建可扩展的、高性能的服务。

    Thrift双向通讯java代码

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年开发并开源,其设计目标是高效、简洁地构建可扩展的...通过理解并熟练掌握Thrift,开发者可以构建出跨平台、高性能的网络服务,提高系统的可扩展性和维护性。

    基于thrift的rpc框架,在thrift基础上增加负载均衡,连接池,性能监控.zip

    Thrift是由Facebook开源的一个高性能、可扩展的跨语言服务开发框架。它的主要功能包括自动生成服务接口、客户端和服务器端代码,简化了服务之间的通信。 本文将详细讲解基于Thrift的RPC框架,并重点介绍如何在其...

    Thrift服务开发框架 v0.16.0.gz

    这个版本的Thrift提供了一种高效、灵活且可扩展的方式来构建分布式系统。Thrift的核心理念是通过定义一种中间描述语言(IDL,Interface Definition Language)来指定服务接口,然后自动生成不同编程语言的客户端和...

    Laravel开发-thrift-laravel

    2. **高性能通信**:Thrift-Laravel利用Thrift的高效序列化和反序列化机制,实现快速的数据交换,尤其适合大数据量和高并发场景。 3. **多语言支持**:由于Thrift支持多种语言,使用Thrift-Laravel可以轻松地在...

    thrift开源项目研究

    Thrift是一种高性能的跨语言服务框架,由Facebook于2007年开发并开源,现已成为Apache软件基金会的顶级项目。它的主要目标是解决分布式系统中的通信问题,通过提供一套代码生成工具,使得开发者可以方便地在不同的...

    PHP高性能服务化框架介绍.pptx

    服务化是一种将大型复杂系统分解为多个小型、独立的服务的架构模式,这种模式有助于提高系统的可维护性、可扩展性和灵活性。PHP高性能服务化框架,如PSF(PHP Service Framework),是针对PHP编程语言设计的一种解决...

    thrift官方代码+与dubbo集成支持原生thrift协议

    Dubbo是阿里巴巴开源的一个高性能、轻量级的Java服务治理框架,它专注于服务的暴露、调用、监控和治理。Thrift的原生协议是二进制的,相比HTTP等文本协议更高效,因此在性能要求较高的场景下,选择Thrift作为通信...

    PHP高性能服务框架架构与实践.pdf

    服务化框架在现代软件开发中扮演着重要角色,它使得复杂系统能够被拆分为可独立部署、可扩展的服务。阿里巴巴的HSF和dubbo、Facebook的thrift、Google的grpc以及Twitter的finagle都是业界知名的RPC框架。然而,PHP...

    Java通过Thrift框架实现通讯的示例代码

    Thrift是由Facebook开源的一种高性能的RPC(Remote Procedure Call)框架,它能够将服务定义为接口,然后自动生成多种编程语言的客户端和服务端代码,使得不同语言之间可以方便地进行数据交换。 首先,我们需要理解...

    Thrift-java学习小结

    Thrift是Facebook开源的一款高性能、跨语言的服务框架,它的设计目标是高效地在不同编程语言之间进行通信。本文将基于Thrift的Java实现,总结学习过程中的一些关键知识点,旨在帮助理解Thrift的工作原理以及如何在...

    zk+thrift demo

    而 Thrift 是一个跨语言的服务框架,它提供了编译器和运行时库,可以方便地创建高性能、可扩展的服务。 【描述】"供大家使用" 表明这个 demo 是为了提供给开发者们参考和学习,帮助他们理解如何在自己的项目中运用 ...

    ice-dubbo-thrift-grpc性能测试对比

    在IT领域,选择合适的RPC(远程过程调用)框架对于系统的性能和可扩展性至关重要。本文主要分析了四种常见的RPC框架——ice、dubbo、thrift和grpc的性能表现,通过一组简化的并发测试,对比了它们在不同并发情况下的...

    thrift-编译工具

    2. **高性能**:Thrift使用高效的二进制协议进行序列化和通信,相比XML或JSON,数据传输更紧凑,性能更好。 3. **易于使用**:通过简单的IDL定义,可以快速地在各种语言间建立通信接口。 4. **轻量级**:Thrift...

    workerman-thrift, Thrift RPC for php based on workerman..zip

    总之,workerman-thrift结合了Thrift的跨语言RPC能力和Workerman的高性能网络通信框架,为PHP开发者提供了一套强大、易用的解决方案,有助于构建高效、可扩展的分布式系统。通过熟练掌握和实践,开发者可以极大地...

    Thrift在PHP中简单使用示例--远程服务调用框架

    Apache Thrift是一个强大的开源框架,它允许开发人员在多种编程语言之间进行高效的远程过程调用(RPC)...通过学习和掌握Thrift,你可以创建可扩展、高效率的服务,实现跨语言的服务调用,提高系统的灵活性和可维护性。

    archive_ Thrift服务开发框架 v0.16.0 [江西新余电信].zip.zip

    它主要用于构建可扩展且高性能的服务,允许使用多种编程语言来实现服务的客户端和服务器端。Thrift通过定义一种中间表示(IDL,接口定义语言)来描述服务,然后自动生成对应语言的代码,使得开发者可以轻松地在不同...

Global site tag (gtag.js) - Google Analytics