在启动httpserver服务之后,
image.png
rpcServer = createRpcServer(conf);
进入源码:
protected NameNodeRpcServer createRpcServer(Configuration conf)
throws IOException {
return new NameNodeRpcServer(conf, this);
}
发现是new 了一个 NameNodeRpcServer对象,于是继续查看源码:
源码太长了,总结一下就是:
总共分三个部分:
1:设置ProtocolEngine
RPC.setProtocolEngine(conf, ClientNamenodeProtocolPB.class,
ProtobufRpcEngine.class);
然后实例化各种协议和服务的对象,比如client和namenode之间进行通信需要调用的接口(创建目录,管理block,设置权限等操作)
2:启动ServiceRpcServer
image.png
采用的建造者模式,这个服务主要是用来namenode和datanode之间的调用(握手,注册,心跳,数据块的汇报)
3.启动clientRpcServer
image.png
主要是用于namenode和client之间的服务
最后会在initialize方法里的startCommonServices(conf)里启动RPC服务
image.png