Thrift
初识Thrift
Thrift是一个跨语言通信的RPC软件,最初是由FaceBook开发的,现在是Apache的一个顶级项目。
Thrift概念:
Thrift 最初是由 Facebook 开发用做系统内各语言之间的 RPC 通信的一个可扩展且跨语言的软件框架,它结合了功能强大的软件堆栈和代码生成引擎,允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。Thrift 是 IDL 描述性语言的一个具体实现,适用于程序对程序静态的数据交换,需要先确定好数据结构。Thrift 是完全静态化的,当数据结构发生变化时,必须重新编辑IDL文件、代码生成再编译载入的流程,跟其他IDL工具相比较可以视为是 Thrift 的弱项。Thrift 适用于搭建大型数据交换及存储的通用工具,在大型系统中的内部数据传输上相对于 JSON 和 XML 无论在性能、传输大小上有明显的优势。
什么是RPC
Remote Procedure Call Protocol 远程过程调用协议,我们 举个例子说明:
本地调用
public void invoke() {
String param1="string1";
String param2="string2";
String res = getStr(param1,param2);
System.out.println("res = " + res);
}
private String getStr(String str1, String str2) {
return str1 + str2;
}
调用方和被调用方都在一个程序内部,属于进程内调用。CPU 在执行调用时切换去执行被调用函数,执行完后再切换回来执行后续的代码。对调用方而言,执行被调用函数时会阻塞(非异步情况下)直到调用函数执行完毕。
RPC调用
public void test() {
TestQry.Client client = getClient("192.168.4.222", 7800, 5000);
String param1="string1";
String param2="string2";
String res = client.getStr(param1,param2);
System.out.println("res = " + res);
}
这里进程间调用,但是调用方和被调用方不再同一个进程,甚至不同的服务器和机房。进程间调用需要通过网络来传输数据,调用方在执行 RPC 调用时会阻塞(非异步情况下)直到调用结果返回才继续执行后续代码。
小结
现在应该知道什么是RPC了,概括一下就是:RPC是一种通过网络从远程计算机程序上请求服务的方式,它使得开发包括网络分布式多程序在内的应用程序更加容易。
Thrift结构
-
代码框架层
Thrift 定义的服务接口描述文件生成的客户端和服务器端代码框架。
-
数据读写操作层
是根据Thrift 文件生成代码实现数据的读写操作。Thrift允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
Thrift通信
一张图说明服务端启动