美文网首页工作生活
thrift事件交互

thrift事件交互

作者: 5eac0cfdd510 | 来源:发表于2019-07-01 20:22 被阅读0次

    一、thrift

    • 1 thrift简介
      Thrift是一个RPC框架,由facebook开发。它支持可扩展且跨语言的服务的开发,它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk and OCaml等等编程语言间无缝结合的、高效的服务。Thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言
    • 2 thrift基础架构


      thrift.png

      thrift在设计上分四个层次,从下到上分别是:

    • Transport层:抽象了数据在网络中的传输;
    • Protocol层:定义了数据的序列话,反序列化方式。常用的格式有:二进制、压缩格式和json格式;
    • Processor层: Thrift中最关键的一层,它包含thrift文件生成的接口,以及这些接口对应的实现;
    • Server层: 将所有这些(Transport,Protocol与Processor)封装在一起,对外提供服务;

    二、mac安装thrift步骤

     brew install thrift
    
    • 版本输出:thrift -version

    三、thrift使用

    • 3.1 创建thrift文件
    namespace java cn.bintools.daios.example.thrift
    service HelloService{
     i32 add(1:i32 num1,2:i32 num2)
    }
    
    • 3.2 生成相应语言的文件 (已java为例)

    • 3.2.1 命令执行
      thrift --gen java hello.thrift
      \color{#ea4335}{通用语言定义:thrift --gen<language> <Thrift filename>}

    • 3.2.2 命令执行后,会在当前目录中多一个gen-java目录,生成的文件就在里面。结果如下图:


      thriftResult.png
    • 3.3.3 查看HelloService.java文件的内容会发现,定义的hello.thrift文件方法实际是封装在Iface接口中,这意味这服务需要实现的是HelloService.Iface

    ##thrift文件生成的java文件
    package cn.bintools.daios.example.thrift;
    @SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
    @javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.12.0)", date = "2019-05-14")
    public class HelloService {
     
      public interface Iface {
     
        public int add(int num1, int num2) throws org.apache.thrift.TException;
     
      }
    // ... 还有其他生成的方法、类等
    }
    

    四、thrift 语言

    1)编写IDL文件时需要注意的问题
    函数的参数要用数字依序标好,序号从1开始 形式:“序号:参数名”;
    每个函数的最后要加上“,”最后一个函数不加;
    在IDL中可以使用/.... ..../添加注释
    2)IDL支持的数据类型
    IDL大小写敏感,它共支持以下几种基本的数据类型:
    [1]string, 字符串类型,注意是全部小写形式;例如:string aString
    [2]i16, 16位整形类型,例如:i16 aI16Val;
    [3]i32,32位整形类型,对应C/C++/java中的int类型;例如: I32 aIntVal
    [4]i64,64位整形,对应C/C++/java中的long类型;例如:I64 aLongVal
    [5]byte,8位的字符类型,对应C/C++中的char,java中的byte类型;例如:byte aByteVal
    [6]bool, 布尔类型,对应C/C++中的bool,java中的boolean类型; 例如:bool aBoolVal
    [7]double,双精度浮点类型,对应C/C++/java中的double类型;例如:double aDoubleVal
    [8]void,空类型,对应C/C++/java中的void类型;该类型主要用作函数的返回值,例如:void testVoid(),
    除上述基本类型外,IDL还支持以下类型:
    [1]map,map类型,例如,定义一个map对象:map<i32, i32> newmap;
    [2]set,集合类型,例如,定义set<i32>对象:set<i32> aSet;
    [3]list,链表类型,例如,定义一个list<i32>对象:list<i32> aList;

    五、项目搭建

    • 5.1 pom文件依赖
    <dependency>
      <groupId>org.apache.thrift</groupId>
      <artifactId>libthrift</artifactId>
      <version>0.12.0</version>
    </dependency>
    

    \color{#ea4335}{这里的版本号与生成helloServer.java的thrift的版本相同。不同则helloServer.java文件中会报错:@org.apache.thrift.annotation.Nullable 缺少}

    • 5.2 服务端开发
      • 5.2.1 实现HelloService.Iface接口
    public class HelloServiceImpl implements HelloService.Iface{
      public int add(int num1,int num2) throws IException{
       return num1+num2
      }
    }
    
    • 5.2.2 通过libthrift提供类库,将服务暴露出去
    package impl;
    
    import cn.bintools.daios.example.thrift.HelloService;
    import org.apache.thrift.protocol.TBinaryProtocol;
    import org.apache.thrift.server.TServer;
    import org.apache.thrift.server.TSimpleServer;
    import org.apache.thrift.transport.TServerSocket;
    import org.apache.thrift.transport.TServerTransport;
    import org.apache.thrift.transport.TTransportException;
    
    /**
    * 服务端
    *
    * @author <a href="jian.huang@bintools.cn">yunzhe</a>
    * @version 1.0.0 2019-05-14-下午4:23
    */
    public class HelloServiceDemo {
    
       public static void main(String[] args) {
           try {
               HelloService.Processor<HelloServiceImpl> processor = new HelloService.Processor<HelloServiceImpl>(new HelloServiceImpl());
               TServerTransport serverTransport = new TServerSocket(8888);
               TServer.Args param = new TServer.Args(serverTransport);
               param.processor(processor);
               param.protocolFactory(new TBinaryProtocol.Factory());
    
               TServer server = new TSimpleServer(param);
               System.out.println("Starting Thrift Server ... ...");
               server.serve();
           } catch (TTransportException e) {
               e.printStackTrace();
           }
       }
    }
    
    • 5.3客户端开发
    package impl;
    import cn.bintools.daios.example.thrift.HelloService;
    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;
     
    /**
     * 客户端
     *
     * @author <a href="jian.huang@bintools.cn">yunzhe</a>
     * @version 1.0.0 2019-05-14-下午4:29
     */
    public class HelloServiceClient {
        public static void main(String[] args) {
            try {
                TTransport tTransport = new TSocket("127.0.0.1", 8888);
                tTransport.open();
     
                TProtocol protocol = new TBinaryProtocol(tTransport);
                HelloService.Client client = new HelloService.Client(protocol);
                System.out.println(client.add(200,200));
                tTransport.close();
            } catch (TTransportException e) {
                e.printStackTrace();
            }catch (TException e){
                e.fillInStackTrace();
            }
        }
    }
    

    码云地址:https://gitee.com/huangjian163/thirft.git

    六、总结

    在本地搭建thrift并通过命令生成需要的语言的文件目前已经可以正常和使用。但是如何集成到spring boot项目中?请查看下一篇文章,地址为:https://www.jianshu.com/p/3ca4a44c2a4c

    相关文章

      网友评论

        本文标题:thrift事件交互

        本文链接:https://www.haomeiwen.com/subject/foincctx.html