在上一篇文章Hadoop源码分析之IPC机制中分析了Hadoop IPC中客户端与服务器端交互示例,现在从服务器端的角度来分析服务器端的初始化及启动过程
Hadoop IPC的代码结构
在org.apache.hadoop.ipc包中有如下几个Java文件:
- Client.java 包含了与IPC客户端相关的代码
- ConnectionHeader.java 包含了IPC中客户端与服务器建立连接时发送的消息头
- RemoteException.java 远程异常,应用与IPC客户端,表示远程过程调用的错误
- RPC.java 包含了实现客户端和服务器端的相关代码,在Client.java和Server.java基础上实现了IPC
- Server.java 包含了与IPC服务器相关的代码
- Status.java 枚举类,定义了远程过程调用的返回结果,包括SUCCESS、ERROR和FATAL三种情况
- VersionedProtocol.java 远程接口,IPC的远程接口都必须继承这个接口
这篇文章主要分析与服务器相关的代码,主要的代码在Server.java和RPC.java这两个文件中。
Server端的初始化
在示例的服务器端代码中有这么一行代码
Server server = RPC.getServer(queryService, "0.0.0.0", IPC_PORT, 1, true, conf);
这行代码即执行了Server的初始化,在服务器端创建了一个Server对象。Server.getServer()共有三个重载方法
getServer()方法有三个重载方法,分别为:
/** Construct a server for a protocol implementation instance listening on a
* port and address.<br/>
* @param instance 所要调用接口的实例,即IPC方法调用的目标
* @param bindAddress 服务器端绑定的IP地址
* @param port 监听端口
* @param conf 配置Server对象的配置参数
* */
public static Server getServer(final Object instance, final String bindAddress, final int port, Configuration conf)
throws IOException {
return getServer(instance, bindAddress, port, 1, false, conf);
}
/** Construct a server for a protocol implementation instance listening on a
* port and address.
* @see #getServer(Object, String, int, Configuration)
* @param numHandlers 处理器线程的个数,即Server端的Handler实例(线程)的个数
* @param verbose 是否打开调用方法日志
* */
public static Server getServer(final Object instance, final String bindAddress, final int port,
final int numHandlers,
final boolean verbose, Configuration conf)
throws IOException {
return getServer(instance, bindAddress, port, numHandlers, verbose, conf, null);
}
/** Construct a server for a protocol implementation instance listening on a
* port and address, with a secret manager.
* @see #getServer(Object, String, int,