• Apache Thrift with Java Quickstart(thrift入门及Java实例)


        thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
    

    1. 概述

    Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

    官网地址:thrift.apache.org
    推荐值得一看的文章:
    http://thrift.apache.org/
    http://thrift.apache.org/download
    http://jnb.ociweb.com/jnb/jnbJun2009.html
    http://wiki.apache.org/thrift

    2. maven依赖

    如果是Maven构建项目的,直接在pom.xml 中添加如下内容:

    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.9.2</version>
    </dependency>

    3. 基本概念

    3.1.数据类型

    基本类型:
    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:utf-8编码的字符串,对应 Java 的 String
    结构体类型:
    struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
    容器类型:
    list:对应 Java 的 ArrayList
    set:对应 Java 的 HashSet
    map:对应 Java 的 HashMap
    异常类型:
    exception:对应 Java 的 Exception
    服务类型:
    service:对应服务的类
    3.2.服务端编码基本步骤:

    实现服务处理接口impl
    创建TProcessor
    创建TServerTransport
    创建TProtocol
    创建TServer
    启动Server
    3.客户端编码基本步骤:

    创建Transport
    创建TProtocol
    基于TTransport和TProtocol创建 Client
    调用Client的相应方法
    4.数据传输协议

    TBinaryProtocol : 二进制格式.
    TCompactProtocol : 压缩格式
    TJSONProtocol : JSON格式
    TSimpleJSONProtocol : 提供JSON只写协议, 生成的文件很容易通过脚本语言解析
    tips:客户端和服务端的协议要一致

    4、实例演示

    在此前一定要安装thrift,可以在windows上安装也可以在linux上安装,只要能执行thrift命令产生服务端接口就行了。

    4.1. 新增一个文件 add.thrift,包含以下内容:

    如果你用过 Google Protocol Buffer一定不会对下面的操作感到陌生。

    namespace java com.jamesfen.thrift  // java的包名 
        typedef i32 int  //typedefs to get convenient names for your types 
        service AdditionService {  // defines the service to add two numbers 
        int add(1:int n1, 2:int n2), //defines a method 
    }

    4.2.产生服务端接口代码,执行以下命令

    thrift --gen java add.thrift

    4.3. 实现接口
    当你操作完第二步后,会当前目录产生一个gen-java文件夹,里面包含了一个AdditionService.java文件,把这个类拷到你的包中。有一个要实现的内部接口,现在要实现该接口。

    package com.jamesfen.thrift;
    import org.apache.thrift.TException;
    public class AdditionServiceHandler implements AdditionService.Iface{
    
        @Override
        public int add(int n1, int n2) throws TException {
          return n1 + n2;
    
        }
    }
    

    4.4.服务端代码,为AdditionServiceHandler类开启一个监听接口(9090)

    package com.jamesfen.thrift;
    import org.apache.thrift.transport.TServerSocket;
    import org.apache.thrift.transport.TServerTransport;
    import org.apache.thrift.server.TServer;
    import org.apache.thrift.server.TServer.Args;
    import org.apache.thrift.server.TSimpleServer;
    
    public class MyServer {
        public static void StartsimpleServer(
                AdditionService.Processor<AdditionServiceHandler> processor) {
            try {
                TServerTransport serverTransport = new TServerSocket(9090);
                TServer server = new TSimpleServer(
                        new Args(serverTransport).processor(processor));
                // Use this for a multithreaded server
                // TServer server = new TThreadPoolServer(new
                // TThreadPoolServer.Args(serverTransport).processor(processor));
                System.out.println("Starting the simple server...");
                server.serve();
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        public static void main(String[] args) {
    
            StartsimpleServer(new AdditionService.Processor<AdditionServiceHandler>(
                    new AdditionServiceHandler()));
         }
    }
    

    5.客户端代码,请求服务

    package com.jamesfen.thrift;
    
    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 AdditionClient {
    
        public static void main(String[] args) {
    
            try {
                TTransport transport;
                transport = new TSocket("localhost", 9090);
                transport.open();
                TProtocol protocol = new TBinaryProtocol(transport);
                AdditionService.Client client = new AdditionService.Client(protocol);
    
                System.out.println(client.add(100, 200));
    
                transport.close();
            } catch (TTransportException e) {
                e.printStackTrace();
            } catch (TException x) {
                x.printStackTrace();
            }
        }
    
    }
    

    4.6.运行结果
    服务端:
    Starting the simple server…
    客户端:
    300
    4.7:demo源码
    https://github.com/Bellonor/myhadoop2.x/tree/master/myhadoop2.x/src/main/java/com/jamesfen/thrift

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    redis参数AOF参数的bug
    tidb损坏tikv节点怎么恢复集群
    mysql主从延时临时解决办法
    python脚本批量杀死redis链接
    pt-online-schema-change 脚本化
    mysql查看锁等信息SQL
    mongo复制集脑裂问题如何处理
    日志收集及网络包收集方案
    各浏览器下载文件名不乱码的解决办法
    java 中 byte[]、File、InputStream 互相转换
  • 原文地址:https://www.cnblogs.com/jamesf/p/4751453.html
Copyright © 2020-2023  润新知