一、什么是RPC?
(1)Remote Procdure call ,远程方法调用,它允许一台计算机程序远程调用另外一台计算机的子程序,而不用去关心底层的网络通信细节,对我们来说是透明的。经常用于分布式网络通信中。
(2)Hadoop的进程间交互都死通过RPC来进行的,比如Namenode与Datanode直接,Jobtracker与Tasktracker之间等。
流程:
(1)RPC采用了C/S的模式;
(2)Client端发送一个带有参数的请求信息到Server;
(3)Server接收到这个请求以后,根据发送过来的参数调用相应的程序,然后把自己计算好的结果发送给Client端;
(4)Client端接收到结果后继续运行;
RPC特点
(1)透明性:远程调用其他机器上的程序,对用户来说就像是调用本地方法一样;
(2)高性能:RPC server能够并发处理多个来自Client的请求;
(3)可控性:jdk中已经提供了一个RPC框架——RMI,但是该PRC框架过于重量级并且可控之处比较少,所以Hadoop RPC实现了自定义的PRC框架。
二、Hadoop的RPC机制
(1)序列化层:Clent与Server端通信传递的信息采用了Hadoop里提供的序列化类或自定义的Writable类型;
(2)函数调用层:Hadoop RPC通过动态代理以及java反射实现函数调用;
(3)网络传输层:Hadoop RPC采用了基于TCP/IP的socket机制;
(4)服务器端框架层:RPC Server利用java NIO以及采用了事件驱动的I/O模型,提高RPC Server的并发处理能力;
Hadoop RPC设计技术
(1)动态代理
(2)反射——动态加载类
(3)序列化
(4)非阻塞的异步IO(NIO)
java动态代理
相关类与接口:
1.java.lang.reflect.Proxy
2.java.lang.reflect.InvocationHandler
动态代理创建对象过程:
1.InvocationHandler handler = new InvocationHandlerImpl();
2.Proxy.newProxyInstance();
(1)动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象。
(2)动态代理可以对请求进行其他的一些出来,在不允许直接访问某些类,或需要对访问做一些特殊处理等,这时候可以考虑使用代理。
(3)目前Java开发包中提供了对动态代理的支持,但现在只支持对接口的实现。