RPC总体架构
同其他RPC框架一样,Hadoop RPC主要分为四个部分,分别是序列化层、函数调用层、网络传输层和服务器端处理框架,具体实现机制如下:
- 序列化层。序列化主要作用是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储,在RPC框架中,它主要用于将用户请求中的参数或者应答转化成字节流以便跨机器传输。前面介绍的Protocol Buffers和Apache Avro均可用在序列化层,Hadoop本身也提供了一套序列化框架,一个类只要实现Writable接口即可支持对象序列化与反序列化。
- 函数调用层。函数调用层主要功能是定位要调用的函数并执行该函数,Hadoop RPC采用了Java反射机制与动态代理实现了函数调用。
- 网络传输层。网络传输层描述了Client与Server之间消息传输的方式,Hadoop RPC采用了基于TCP/IP的Socket机制。
- 服务器端处理框架。服务器端处理框架可被抽象为网络I/O模型,它描述了客户端与服务器端间信息交互方式,它的设计直接决定着服务器端的并发处理能力,常见的网络I/O模型有阻塞式I/O、非阻塞式I/O、事件驱动I/O等,而Hadoop RPC采用了基于Reactor设计模式的事件驱动I/O
Hadoop RPC使用方法
- public static <T>ProtocolProxy <T>getProxy/waitFor-Proxy(…):构造一个客户端代理对象(该对象实现了某个协议),用于向服务器发送RPC请求。
- public static Server RPC.Builder (Configuration).build():为某个协议(实际上是Java接口)实例构造一个服务器对象,用于处理客户端发送的请求。
- 定义暴露服务的接口,接口需要扩展org.apache.hadoop.ipc.VersionedProtocol
- 为接口提供实现类
- 绑定接口和实现类,并通过RPC暴露接口。
Server server = new RPC.Builder(conf).setProtocol(SelfProtocol.class) .setInstance(new SelfProtocolImpl()).setBindAddress(ADDRESS).setPort(0) .setNumHandlers(5).build();
server.start();
- rpc远程调用。
#客户端实现
proxy = (ClientProtocol)RPC.getProxy(ClientProtocol.class, ClientProtocol.versionID, addr, conf);
int result = proxy.add(5, 6);
String echoResult = proxy.echo("result");