1、RPC框架概述
1.1 RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。
1.2 RPC通常采用客户端服务器模型,其框架主要有以下几部分
- 通信模块:实现请求应该协议。主要分为同步方式和异步方式。
- stub程序:客户端和服务器均包含stub程序,可以看做代理程序。使得远程函数表现的跟本地调用一样,对用户程序完全透明。
- 调度程序:接受来自通信模块的请求消息,根据标识选择stub程序处理。并发量大一般采用线程池处理。
- 客户程序/服务过程:请求发出者和请求的处理者。
1.3 RPC流程图
2、Hadoop RPC基本框架
2.1Hadoop RPC的使用方法见代码
服务 public interface MyBiz extends VersionedProtocol { long PROTOCOL_VERSION = 12321443L; String hello(String name); } public class MyBizImpl implements MyBiz { @Override public long getProtocolVersion(String arg0, long arg1) throws IOException { return PROTOCOL_VERSION; } @Override public String hello(String name) { System. out.println( "invoked"); return "hello " + name; } } 服务器 public class MyServer { public static final String SERVER_ADDRESS = "localhost"; public static final int SERVER_PORT = 12345; public static void main(String[] args) throws IOException { Server server = RPC. getServer(new MyBizImpl(), SERVER_ADDRESS, SERVER_PORT , new Configuration()); server.start(); } } 客户端 public class MyClient { public static void main(String[] args) throws IOException { MyBiz proxy = (MyBiz) RPC. getProxy(MyBiz.class, MyBiz.PROTOCOL_VERSION, new InetSocketAddress(MyServer. SERVER_ADDRESS,MyServer.SERVER_PORT), new Configuration()); String result = proxy.hello( "5"); System. out.println(result); RPC.stopProxy(proxy); } } |
2.2 org.apache.hadoop.ipc.RPC类解析
RPC类主要包含三部分:
- ClientCache(成员变量):根据用户提供的SocketFactory来缓存Client对象,以便重用Client对象。
- Server(内部类):继承Server抽象类,利用反射实现了call方法,即客户端请求的方法和对应参数完成方法调用。
- Invocation(内部类):将要调用的方法名和参数打包成可序列化的对象,方便客户端和服务器之间传递。
2.3 客户端