RPC框架利用的Java的反射能力,该RPC框架要求调用的参数和返回结果必须是Java的基本类型,String和Writable接口的实现类,以及元素为以上类型的数组。同时,接口方法应该只抛出IOException异常。
选择了java,为什么不用现成的rmi?
答案就是:使用rpc可以对连接进行精细控制、超时、缓冲区处理等进行精确处理,rmi在这方面难以提供。
Dynamic Proxy其实就是一个典型的Proxy模式,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作。这个handler,在Hadoop的RPC中,就是Invoker对象。
Client和Server之间的控制信息是通过RPC机制完成的。DataNode端是通过获得NameNode的代理,通过该代理和NameNode进行通信的。Client通过RPC机制、动态代理机制调用Server端的方法,Server端将方法调用结果返回给Client。
RPC.Invocation是一个方法调用类。包含以下变量:
private String methodName;//方法名
private Class[] parameterClasses;//参数类型
private Object[] parameters;//参数值
private Configuration conf;
继承了Writeable,所以可以用于序列化传输。readFields和write方法分别借助ObjectWriteable类对上述三种变量的序列化和反序列化。
RPC.ClientCache是客户端的缓存,用于维护客户端集合,定义如下:
private Map<SocketFactory, Client> clients = new HashMap<SocketFactory, Client>();
在getClient中,如果SocketFactory对应的client不存在,就new一个,并将其加入clients中。
VersionMismatch是一个异常类,当Client的协议版本与Server的协议版本不匹配时会抛出此异常。
InvocationHandler 是代理实例的调用处理程序实现的接口。