RPC部分的代码位于工程hadoop-common中,有三个主要的类。

1 org.apache.hadoop.ipc.Server

该类秉承了reactive programming的思想,结合了Java NIO,是一个高性能的服务器端实现,总的来说可以分为四部分。

Listener:
private Listener listener = null;
private class Listener extends Thread {
  // 非阻塞同步I/O
  private ServerSocketChannel acceptChannel = null;
  private Selector selector = null;
  // 读进程
  private Reader[] readers = null;
}

Queue:
private BlockingQueue<Call> callQueue;

Handler:
private Handler[] handlers = null;
private class Handler extends Thread {
  @Override
  public void run() {
    while (running) {
      try {
      //不断从队列中读取Call处理
      final Call call = callQueue.take();
      // call是一个抽象方法,选择合适的rpcInvoker,执行远程调用方法
      value = call(...);
      //通过responder返回消息
      responder.doRespond(call);
      }
    }
  }
}

Responder:
private Responder responder = null;

另外网络层的读写逻辑和连接信息封装在public class Connection中。

2 org.apache.hadoop.ipc.Client

Client的实现很直观,就是一个基于ExecutorService的多线程客户端。

3 org.apache.hadoop.ipc.RPC

RPC类主要是对底层网络进行了封装,提供统一的编程接口,使用动态代理完成远程方法调用。

public class RPC {
  // 封装方法调用的接口
  // 在WritableRpcEngine和ProtobufRpcEngine中有具体的实现
  interface RpcInvoker {}
  // 设置不同的序列化和反序列化引擎:WritableRpcEngine和ProtobufRpcEngine
  public static void setProtocolEngine(...) {}
  // 构建客户端的代理对象
  public static <T> T getProxy() {}
  // 构建RPC服务器的辅助类
  public static class Builder {}
  // 对Server的再封装
  public abstract static class Server extends org.apache.hadoop.ipc.Server {}
}