• thrift实例


    Thrift实例

    Apache thrift是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。

    它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。

    配置第一个thrift实例:

    1、 去thrift官网 http://thrift.apache.org/tutorial/ 下载thrift压缩包和thrift编译工具thrift.exe.如图所示:

    2、  安装ant和maven工具,去官网下载并配置环境变量即可。然后进入/lib/java目录下使用ant编译build.xml,(就是执行ant  build.xml,当然注意路径)可以生成libthrift-0.9.2.jar,如图所示。

    3、  编译一个简单的hello服务:新建文件改名为hello.thrift(注意更改后缀名)内容如下:

    namespace java service.demo 
     service Hello{ 
      string helloString(1:string para) 
     } 

    Thrif文件中为服务定义了方法的接口其中包括返回值类型和参数列表,参数列表中包括参数序号、参数名和参数类型。

    4、Thrift 脚本可定义的数据类型包括以下几种类型:

    • 基本类型:
      • 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:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
    • 容器类型:
      • list:对应 Java 的 ArrayList
      • set:对应 Java 的 HashSet
      • map:对应 Java 的 HashMap
    • 异常类型:
      • exception:对应 Java 的 Exception
    • 服务类型:
      • service:对应服务的类

    5、进入thrift.exe所在目录执行thrift-0.9.2.exe   –gen  java hello.thrift 编译刚才写的thrift脚本就可以得到一个hello.java 文件。

    6、用Java做服务器端和客户端测试服务的发布:

     建立一个Java项目,将生成的hello.java 引入项目中,引入libthrift-0.9.2-snapshot.jar(第二步用ant工具编译生成的)、slf4j-api-1.5.8.jar、slf4j-log4j12-1.5.8.jar 和 log4j-1.2.14.jar四个jar包。项目如下图:

    然后编写接口的实现类,服务端,客户端。

    7、这里为了方便将服务器端代码和实现类写在了一起

             服务器端:

    package demo.rpc;

    import org.apache.thrift.TException;

    import org.apache.thrift.protocol.TBinaryProtocol;

    import org.apache.thrift.protocol.TBinaryProtocol.Factory;

    import org.apache.thrift.server.TNonblockingServer;

    import org.apache.thrift.server.TServer;

    import org.apache.thrift.transport.TNonblockingServerSocket;

    import org.apache.thrift.transport.TNonblockingServerTransport;

    import org.apache.thrift.transport.TTransportException;

     

    import service.demo.Hello;

    /**

     * Thrift测试服务器

     */

    public class Server implements Hello.Iface {

       public static void main(String[] as) {

          TNonblockingServerTransport serverTransport = null;

          try {

            serverTransport = new TNonblockingServerSocket(19090);

          } catch (TTransportException e) {

            e.printStackTrace();

          }

          //Server 为Hello接口的实现类

          Hello.Processor<Hello.Iface> processor = new Hello.Processor<Hello.Iface>(

               new Server());

          Factory protFactory = new TBinaryProtocol.Factory(true, true);

     

          TNonblockingServer.Args args = new TNonblockingServer.Args(

               serverTransport);

          args.processor(processor);

          args.protocolFactory(protFactory);

          TServer server = new TNonblockingServer(args);

          System.out.println("Start server on port 19090 ...");

          server.serve();

       }

     

       @Override

       public String helloString(String para) throws TException {

          return "hello";

       }

    }

    客户端代码如下:package demo.rpc;

     

    import org.apache.thrift.TException;

    import org.apache.thrift.protocol.TBinaryProtocol;

    import org.apache.thrift.transport.TFramedTransport;

    import org.apache.thrift.transport.TSocket;

    import org.apache.thrift.transport.TTransport;

     

    import service.demo.Hello;

     

    /**

     * Thrift测试客户端

     */

    public class Client {

     

       public static void main(String[] args) {

     

          long startTime = System.currentTimeMillis();

          try {

            TTransport transport = new TFramedTransport(new TSocket(

                  "localhost", 19090));

            TBinaryProtocol protocol = new TBinaryProtocol(transport);

            // TCompactProtocol protocol = new TCompactProtocol(transport);

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

            transport.open();

            for (int i = 0; i < 1000; i++) {

               System.out.println(client.helloString("login"));

            }

            transport.close();

          } catch (TException x) {

            x.printStackTrace();

          }

          long endTime = System.currentTimeMillis();

          System.out.println(" 本次调用完成时间:" + (endTime - startTime));

       }

    }

    8、启动服务器端,再运行客户端。控制台打印循环调用1000次服务所用时间。

    本文章属于本人和博客园所有,如有转载请注明出自http://www.cnblogs.com/xucheng
  • 相关阅读:
    Spring AOP两种实现方式
    重温SQL——行转列,列转行
    SpringMVC-Spring-Hibernate项目搭建之一-- 搭建maven 项目 & servlet的demo
    Linnx 服务器中mysql 无法正常访问问题
    SpringMVC-Spring-Hibernate项目搭建之三-- freemarker & 静态资源整合
    one2many &&many2many
    SQL学习
    使用Maven导出项目依赖的jar包
    Java Hash Collision之数据生产
    HashMap出现Hash DOS攻击的问题
  • 原文地址:https://www.cnblogs.com/xucheng/p/4154243.html
Copyright © 2020-2023  润新知