thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言 ActionScript3, glibc, cocoa(iOS), C++, C#, delphi, erlang, go, haskell, html, java, javame(山寨机), jquery, node.js, Ocaml, perl, php, python, ruby, smalltalk, xsd。
简单的说,就是可以让人快速的写Socket Server(服务器)和Client(客户端)。
那么为什么要用thrift开发呢?主要有两个原因:
一个是因为thrift本身帮你封装了很多基本的东西,你不需要自己去写socket里面的bind,accept之类的,以及他们的逻辑。可以很快速的开发基于进程的,线程的,SSL的socket。
第二个理由是标准化,跨语言和跨平台,windows不算在其中。主要是在各种Posix兼容的操作系统中都可以不需要改造基本直接可用,支持的语言种类也很多,基本你会写的,他都支持。你不会写的,他也支持。类似的项目还有ICE和Avro,但是感觉都没有thrift做的易用性好。而且这是facebook开源的诸多项目中,为数不多的能正常编译的软件。
RPC
在了解 Thrift 之前,先来简单科普一下什么是 RPC(远程过程调用)。
先看下面这个栗子:
// 这是一个最简单不过的本地函数调用代码,调用方和被调用方都在一个程序内部,属于进程内调用。
public void invoke(){
String param1 = "my String 1";
String param2 = "my String 2";
String res = getStr(param1, param2);
System.out.println("res=" + res)
}
private String getStr(String str1, String str2){
return str1 + str2;
}
CPU 在执行调用时切换去执行被调用函数,执行完后再切换回来执行后续的代码。对调用方而言,执行被调用函数时会阻塞(非异步情况下)直到调用函数执行完毕。过程如图 1
接下来看个 RPC 调用的栗子:
// 这是一个进程间调用,调用方和被调用方不在同一个进程(甚至不同的服务器或机房)。
public void test(){
TestQry.Client client = getClient("192.168.4.222", 7800, 5000);
String param1 = "my String 1";
String param2 = "my String 2";
String res = client.getStr(param1, param2);
System.out.println("res=" + res);
}
private TestQry.Client getClient(String ip, int port, int timeOut) throws Exception{
TSocket tSocket = new TSocket();
TTransport transport = new TFramedTransport(tSocket);
tTransport.open();
TProtocol protocol = new TBinaryProtocol(tTransport);
return new TestQry.Client(protocol);
}
进程间调用需要通过网络来传输数据,调用方在执行 RPC 调用时会阻塞(非异步情况下)直到调用结果返回才继续执行后续代码。过程如图 2
一言以蔽之,RPC 是一种通过网络从远程计算机程序上请求服务的方式,它使得开发包括网络分布式多程序在内的应用程序更加容易。
Thrift 最初是由 Facebook 开发用做系统内各语言之间的 RPC 通信的一个可扩展且跨语言的软件框架,它结合了功能强大的软件堆栈和代码生成引擎,允许定义一个简单的定义文件中的数据类型和服务接口,以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
Thrift 是 IDL 描述性语言的一个具体实现,适用于程序对程序静态的数据交换,需要先确定好数据结构。
Thrift 是完全静态化的,当数据结构发生变化时,必须重新编辑IDL文件、代码生成再编译载入的流程,跟其他IDL工具相比较可以视为是 Thrift 的弱项。Thrift 适用于搭建大型数据交换及存储的通用工具,在大型系统中的内部数据传输上相对于 JSON 和 XML 无论在性能、传输大小上有明显的优势。
注意, Thrift 不仅仅是个高效的序列化工具,它是一个完整的 RPC 框架体系!
参考:http://www.cnblogs.com/cyfonly/p/6059374.html