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

RPC_THRIFT使用范例

    博客分类:
  • RPC
 
阅读更多

1.下载与安装

  官方网站:http://thrift.apache.org/

  下载地址:http://labs.renren.com/apache-mirror//thrift/0.6.1/thrift-0.6.1.tar.gz

  安装Thrift:

  1. cd /usr/local/src
  2. wget http://labs.renren.com/apache-mirror//thrift/0.6.1/thrift-0.6.1.tar.gz
  3. tar zxvf avro-src-1.5.1.tar.gz
  4. cd thrift-0.6.1
  5. ./configure
  6. make
  7. make install

  进入lib/java目录,执行以下命令编译并生成jar包,请确保已经安装了ant和maven.

  1. ant

  安装后,libthrift-0.6.1-snapshot.jar位于thrift-0.6.1/lib/java/build目录

 

2.消息结构与服务接口

  基本数据类型:

  1. bool: A boolean value (true or false)
  2. byte: An 8-bit signed integer
  3. i16: A 16-bit signed integer
  4. i32: A 32-bit signed integer
  5. i64: A 64-bit signed integer
  6. double: A 64-bit floating point number
  7. string: A text string encoded using UTF-8 encoding

  特殊数据类型:

  1. binary: a sequence of unencoded bytes. Translates to a Java ByteBuffer

  容器:

  1. list<type>: An ordered list of elements. Translates to a Java ArrayList
  2. set<type>: An unordered set of unique elements. Translates to a Java HashSet
  3. map<type1,type2>: A map of strictly unique keys to values. Translates to a Java HashMap

  首先需要编写一个.thrift文件,定义一个消息结构。如下是message.thrift文件内容:

  1. namespace java thrift
  2.  
  3. struct Message {
  4.     1: string name,
  5.     2: i32 type,
  6.     3: double price,
  7.     4: bool valid,
  8.     5: binary content
  9. }
  10.  
  11. service MessageService {
  12.     Message getMessage(1:Message msg)
  13. }

  其中定义了1个结构叫做Message,位于包thrift中,有5个成员name、type、price、valid、content。还定义了1个服务叫做MessageService,其中有一个getMessage方法,需要输入一个参数,类型是message,返回值类型是message。

  编写完message.thrift文件后,执行以下命令,将会gen-java目录中生成相应的java文件,类MessageService的包是thrift。

  1. thrift --gen java message.thrift

3.rpc通信实现

  Thrift会生成结构类和服务类,假设生成的类分别是Message和MessageService,MessageService中定义了服务getMessage(Message msg)。

  服务接口实现MessageServiceImpl.java:

  1. package thrift;
  2.  
  3. import org.apache.thrift.TException;
  4. import thrift.MessageService.Iface;
  5.  
  6. public class MessageServiceImpl implements Iface {
  7.  
  8.     @Override
  9.     public Message getMessage(Message msg) throws TException {
  10.     // process the message
  11.         …
  12.         return msg;
  13.     }
  14.  
  15. }

  服务端实现Server.java:

  1. package thrift;
  2.  
  3. import org.apache.thrift.protocol.TBinaryProtocol;
  4. import org.apache.thrift.protocol.TBinaryProtocol.Factory;
  5. import org.apache.thrift.server.TServer;
  6. import org.apache.thrift.server.TThreadPoolServer;
  7. import org.apache.thrift.transport.TServerSocket;
  8.  
  9. public class Server {
  10.     private int port;
  11.  
  12.     public Server(int port) {
  13.         this.port = port;
  14.     }
  15.  
  16.     public void run() {
  17.         try {
  18.             TServerSocket serverTransport = new TServerSocket(port);
  19.             MessageService.Processor processor = new MessageService.Processor(
  20.                     new MessageServiceImpl());
  21.             Factory protFactory = new TBinaryProtocol.Factory(true, true);
  22.             TThreadPoolServer.Args args = new TThreadPoolServer.Args(
  23.                     serverTransport);
  24.             args.processor(processor);
  25.             args.protocolFactory(protFactory);
  26.             TServer server = new TThreadPoolServer(args);
  27.             server.serve();
  28.         } catch (Exception e) {
  29.             e.printStackTrace();
  30.         }
  31.     }
  32.  
  33.     public static void main(String[] args) {
  34.         if (args.length != 1) {
  35.             System.out.println("Usage: Server port");
  36.             return;
  37.         }
  38.         int port = Integer.parseInt(args[0]);
  39.         new Server(port).run();
  40.     }
  41. }

  客户端实现Client.java:

  1. package thrift;
  2.  
  3. import java.nio.ByteBuffer;
  4. import java.util.Arrays;
  5.  
  6. import org.apache.thrift.protocol.TBinaryProtocol;
  7. import org.apache.thrift.protocol.TProtocol;
  8. import org.apache.thrift.transport.TSocket;
  9. import org.apache.thrift.transport.TTransport;
  10.  
  11. public class Client {
  12.     private int port;
  13.     private String host;
  14.     private int size;
  15.     private int count;
  16.  
  17.     public Client(int port, String host, int size, int count) {
  18.         super();
  19.         this.port = port;
  20.         this.host = host;
  21.         this.size = size;
  22.         this.count = count;
  23.     }
  24.  
  25.     public long run() {
  26.         long start = 0;
  27.         long end = 0;
  28.         TTransport transport = null;
  29.         try {
  30.             transport = new TSocket(host, port);
  31.             TProtocol protocol = new TBinaryProtocol(transport);
  32.             MessageService.Client client = new MessageService.Client(protocol);
  33.             transport.open();
  34.  
  35.             Message message = new Message();
  36.             // initiate the message
  37.             …
  38.  
  39.             start = System.currentTimeMillis();
  40.             for (int i = 0; i < count; i++) {
  41.                 client.getMessage(message);
  42.             }
  43.             end = System.currentTimeMillis();
  44.             System.out.println(end - start);
  45.         } catch (Exception e) {
  46.             e.printStackTrace();
  47.         } finally {
  48.             if (transport != null) {
  49.                 transport.close();
  50.             }
  51.         }
  52.  
  53.         return end - start;
  54.     }
  55.  
  56.     public static void main(String[] args) {
  57.         if (args.length != 4) {
  58.             System.out.println("Usage: Client host port dataSize count");
  59.             return;
  60.         }
  61.         String host = args[0];
  62.         int port = Integer.parseInt(args[1]);
  63.         int size = Integer.parseInt(args[2]);
  64.         int count = Integer.parseInt(args[3]);
  65.  
  66.         new Client(port, host, size, count).run();
  67.     }
  68. }

4.参考资料

  (1) Thrift wiki: http://wiki.apache.org/thrift/

分享到:
评论

相关推荐

    RPC-code_rpc_

    在本项目"RPC-code_rpc_"中,我们关注的是RPC的实现,特别是通过Thrift和RMI两种技术进行服务器间的交互。 **Thrift** 是Facebook开源的一种高性能、跨语言的服务交互框架。它的主要功能是生成跨语言的客户端和...

    gen-cpp.rar_CppServer.cpp_gencpp_thrift_thrift gen_thrift gen-cp

    本例是一个简单的thrift测试程序,包括客户端和服务端。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

    thrift_castle2t1_thrift_Known_

    总的来说,"thrift_castle2t1_thrift_Known_"这个项目揭示了一个基于Thrift构建的成熟服务,其源代码可以帮助我们学习Thrift的使用,理解跨语言服务交互的机制,并从中汲取构建高效分布式系统的经验。通过对源码的...

    test_hive.rar_ThriftHive.php_hive_hive php_php hive_php hive Thr

    标题中的“test_hive.rar_ThriftHive.php_hive_hive php_php hive_php hive Thr”暗示了我们讨论的主题是关于使用PHP通过Thrift接口与Hive数据仓库进行交互的一个库,具体来说,是一个名为“ThriftHive.php”的文件...

    CSS_namespace_thrift接口文档

    压缩包内的“CSS_namespace_thrift接口文档2.txt”可能包含了关于如何定义和使用这些命名空间的详细说明,包括如何处理跨服务通信时的命名冲突,以及如何为不同的CSS服务定义独特的命名空间。可能还涵盖了如何在实际...

    hbase_hive_thrift_php

    总结一下,"hbase_hive_thrift_php"这个主题涵盖了如何使用PHP通过Thrift与HBase和Hive进行交互,以实现大数据的存储、管理和Web应用中的查询。这种技术栈对于需要在PHP环境中处理大规模数据的项目非常有价值。

    Python库 | gunicorn_thrift-0.2.13-py2-none-any.whl

    安装完成后,你需要编写Thrift IDL文件定义服务接口,然后使用Thrift编译器生成Python代码。接着,创建你的Thrift服务实现,通常这会包含一个继承自Thrift生成的类的Python类。最后,配置Gunicorn以启动并托管这个...

    gunicorn_thrift:用于gunicorn的python节俭服务器插件

    Thrift是一种跨语言的服务开发框架,它能够通过定义服务接口和数据类型来生成多语言的客户端和服务器代码,实现高效、简洁的RPC(远程过程调用)通信。 Gunicorn,全称Green Unicorn,是一款广泛使用的Python WSGI...

    php_thrift_python安装测试记录

    本篇文章将围绕“php_thrift_python安装测试记录”这一主题,深入探讨如何在PHP中使用Thrift客户端调用Python服务端,并分享相关的安装步骤和代码示例。 首先,我们来看Thrift的基本工作原理。Thrift通过一种中间...

    HBASE_thrift_cpp.rar

    在这个"**HBASE_thrift_cpp.rar**"压缩包中,我们可以推测其内容可能包含了一套使用C++语言通过Thrift与HBase进行交互的示例或库。下面将详细解释如何使用C++通过Thrift访问HBase以及涉及的关键知识点。 1. **...

    Python库 | takumi_thrift-0.2.1-py2.py3-none-any.whl

    这通常包括创建Thrift定义文件(.thrift),该文件描述服务接口和数据结构,然后使用Thrift编译器生成相应的Python代码。 Thrift的主要优点在于它的性能和可扩展性。由于其底层使用C++实现,与网络交互时的性能较高...

    Python库 | ctec_thrift_client_py3-1.0.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:ctec_thrift_client_py3-1.0.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    PyPI 官网下载 | takumi_thrift-0.2.1-py2.py3-none-any.whl

    资源来自pypi官网。 资源全名:takumi_thrift-0.2.1-py2.py3-none-any.whl

    Python库 | atc_thrift-0.1.5.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:atc_thrift-0.1.5.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    使用thrift、websocket在javascript和cpp之间建立rpc调用

    使用thrift、websocket在javascript和c++之间建立rpc调用机制。 如果要使用js+html来写界面,cpp来写底层业务逻辑,这就非常有用了。 当然,如果底层不用cpp来写,也可以参考本代码的js对thrift的rpc包装。

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

    例如,可以使用Thrift来构建跨语言的RPC(远程过程调用)服务,使不同语言的客户端能够无缝调用服务端功能。同时,由于其高效和轻量级的特性,Thrift也被广泛应用于大数据处理和实时分析系统中。

    dubbo-rpc-thrift-2.8.4.jar

    java运行依赖jar包

    Thrift RPC客户端的服务化框架代码

    Thrift RPC客户端的服务化框架代码主要涉及了两个关键概念:Thrift和RPC(Remote Procedure Call,远程过程调用)。Thrift是由Facebook开发的一种开源跨语言服务框架,它允许定义数据类型和服务接口,然后自动生成...

Global site tag (gtag.js) - Google Analytics