RPC概念:
Remote Procedure Call ,远程过程调用,也就是说,调用过程代码不是在调用者本地运行,而是要实现调用者与被调用者二者之间的链接与通信形式
RPC的基本通信模型是基于Client/Server进程间星湖通信的一种同步通信形式,他对Client提供了远程服务的过程抽象,其底层消息传递操作对Client是透明
的。在RPC中,client即是请求服务调用者,而server则是Client的请求而被调用的程序。
RPC协议图:
首先是建立RPC服务,约定底层的RPC传输通道(UDP或者是TCP).客户端的调用参数根据传输前所提供的目的地址及RPC上层应用程序号,通过
底层传输通道转至相应的服务器,即RPC application programme server.客户端随机处于等待状态,以服务器等待应答或者TimeOut超时信号。
当服务器获得了请求消息,会根据注册RPC时告诉RPC系统的程序入口地址执行相应的操作,并将结果返回到客户端。当一次RPC调用结束后,相应
线程发送相应的信号,客户端程序编继续运行。
hadoop中对rpc的实现
客户端代码
package cn.itcast.rpc;
import java.io.IOException;
import java.net.InetSocketAddress;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
/**
* 客户端获得业务类的动态代理对象
* @author Administrator
*
*/
public class RPCClient {
public static void main(String[] args) throws IOException {
Bizable proxy = RPC.getProxy(Bizable.class, 12120L, new InetSocketAddress("192.168.80.100",9527), new Configuration());
String name = proxy.sayHi("Kitty");
System.out.println(name);
}
}
客户端代码
package
cn.itcast.rpc;
import java.io.IOException;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.ipc.RPC;
import org.apache.hadoop.ipc.RPC.Server;
/**
* 服务器端
* @author Administrator
*
*/
public class RPCServer implements Bizable{
public static void main(String[] args) throws Exception{
Server server = new RPC.Builder(new Configuration()).setInstance(new RPCServer()).setProtocol(Bizable.class).setBindAddress("192.168.80.100").setPort(9527).build();
server.start();
}
@Override
public String sayHi(String name) {
return "hello "+ name;
}
}
业务接口
package cn.itcast.rpc;
/**
* 服务器端与客户端都必须要实现的业务接口
* @author Administrator
*
*/
public interface Bizable {
//版本号
public static final long versionID = 12120L;
public String sayHi(String name);
}