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.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目录,生成的文件就在里面。结果如下图:
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>
- 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