转载:http://www.cnblogs.com/cyfonly/p/6059374.html
1、所谓的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 在执行调用时切换去执行被调用函数,执行完后再切换回来执行后续的代码。对调用方而言,执行被调用函数时会阻塞(非异步情况下)直到调用函数执行完毕。过程如图
接下来看个 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 调用时会阻塞(非异步情况下)直到调用结果返回才继续执行后续代码。过程如图。
一言以蔽之,RPC 是一种通过网络从远程计算机程序上请求服务的方式,它使得开发包括网络分布式多程序在内的应用程序更加容易。