源码级强力分析Hadoop的RPC机制(6)

四.ipc.Server源码分析

同样,为了让大家对ipc.Server有个初步的了解,我们先分析一下它的几个内部类吧:

Call :用于存储客户端发来的请求
Listener : 监听类,用于监听客户端发来的请求,同时Listener内部还有一个静态类,Listener.Reader,当监听器监听到用户请求,便让Reader读取用户请求。
Responder :响应RPC请求类,请求处理完毕,由Responder发送给请求客户端。
Connection :连接类,真正的客户端请求读取逻辑在这个类中。
Handler :请求处理类,会循环阻塞读取callQueue中的call对象,并对其进行操作。

如果你看过ipc.Server的源码,你会发现其实ipc.Server是一个abstract修饰的抽象类。那随之而来的问题就是:Hadoop是怎样初始化RPC的Server端的呢?这个问题着实也让我想了好长时间。不过后来我想到Namenode初始化时一定初始化了RPC的Sever端,那我们去看看Namenode的初始化源码吧:

1. 初始化Server

代码十:

private void initialize(Configuration conf) throws IOException {       ???        // 创建 rpc server        InetSocketAddress dnSocketAddr = getServiceRpcServerAddress(conf);        if (dnSocketAddr != null) {          int serviceHandlerCount =            conf.getInt(DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_KEY,                        DFSConfigKeys.DFS_NAMENODE_SERVICE_HANDLER_COUNT_DEFAULT);          //获得serviceRpcServer          this.serviceRpcServer = RPC.getServer(this, dnSocketAddr.getHostName(),               dnSocketAddr.getPort(), serviceHandlerCount,              false, conf, namesystem.getDelegationTokenSecretManager());          this.serviceRPCAddress = this.serviceRpcServer.getListenerAddress();          setRpcServiceServerAddress(conf);    }    //获得server        this.server = RPC.getServer(this, socAddr.getHostName(),            socAddr.getPort(), handlerCount, false, conf, namesystem            .getDelegationTokenSecretManager());          ???        this.server.start();  //启动 RPC server   Clients只允许连接该server        if (serviceRpcServer != null) {          serviceRpcServer.start();  //启动 RPC serviceRpcServer 为HDFS服务的server        }        startTrashEmptier(conf);      }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/973f4028c89c9cbacf526d4b5acb8f29.html