thrift事件交互

一、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事件交互_第1张图片
    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

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


    thrift事件交互_第2张图片
    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 newmap;
[2]set,集合类型,例如,定义set对象:set aSet;
[3]list,链表类型,例如,定义一个list对象:list aList;

五、项目搭建

  • 5.1 pom文件依赖

  org.apache.thrift
  libthrift
  0.12.0

  • 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 yunzhe
* @version 1.0.0 2019-05-14-下午4:23
*/
public class HelloServiceDemo {

   public static void main(String[] args) {
       try {
           HelloService.Processor processor = new HelloService.Processor(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 yunzhe
 * @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事件交互)