Apache Thrift是一个由Facebook开发的RPC框架,目标是尽可能高效、无缝地跨语言进行可靠、高性能的通信和数据序列化。
RPC
RPC全称为Remote Procedure Call,意为远程过程调用。
假设有两个应用A和B分别部署在两台服务器上,当应用A要调用应用B的某个方法时,因为两个应用不在同一进程中,不能够直接进行调用,那就涉及到网络传输。在A和B之间搭建一条网络通道,A将参数传给B,B接收到参数后再将方法执行结果返回给A。这个过程中涉及到很多东西,比如说Socket、多线程、网络I/O等, Thrift就是一个封装了这些技术的框架,以便开发人员进行快速开发。
跨语言
Thrift通过IDL语言(Interface Description Language,接口描述语言)来实现跨语言技术。在.thrift文件中定义接口和属性数据类型,然后利用thrift提供编译器将其生成为不同开发语言的类,以满足不同种语言的开发者。如Java、C++等。生成的类中不仅包含类的属性、接口,还有RPC协议层和传输层的实现代码。
协议栈结构
Thrift是一种C/S架构体系。code层是开发者自行实现的业务逻辑的代码,第二层是由thrift编译器自动生成的代码,主要用于数据的接收、解析、发送。
Server端接收到Client的请求之后,将请求转发给Processor进行处理。Processor负责对Client的请求进行响应,主要包括RPC请求转发、调用参数解析、业务逻辑调用、返回值写回等处理。Tprotocal及其以下是thrift的传输协议及底层I/O通信。TProtocol负责解析结构化数据,将结构化数据转化为字节流给TTransport进行传输。TTransport是与底层数据传输密切相关的传输层,负责以字节流方式接收和发送消息体,不关注是什么数据类型。底层IO负责实际的数据传输,包括socket、文件和压缩数据流等。
Demo
项目结构
Async类是异步调用,暂不用关注
Hello.thrift文件
namespace java xxx
service Hello{
string helloString(1:string para);
i32 helloInt(1:i32 para);
bool helloBoolean(1:bool para);
void helloVoid();
string helloNull();
}
写好Hello.thrift文件后,在Hello.thrift所在目录下执行thrift命令生成相关类文件:thrift -r -gen java Hello.thrift
(默认已经安装thrift环境,如要生成其他语言的类,将java换为其他语言,如c++)。然后将生成的类文件移至项目目录下。
相关依赖
<dependency>
<groupId>org.apache.thrift</groupId>
<art