Hadoop2.2.0代码阅读-RPC部分
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 {}
}