既然是RPC,就一定有Client端和Server端,
如果进行一次HDFS的读写,其中一个DataNode需要跟NameNode建立连接,也需要和其他的DataNode建立连接,那么每一个Client需要维护多个连接。同时为了减少不必要的连接,Client的做法是拿Connectionid来作为Connection的ID。
RPC Client的结构
Client.ConnectionId:到RPC Server对象连接的标识(IP地址+端口号或者主机名+端口号)
Client.Call:Call调用的信息。
Client.ParallelResults:Call响应
RPC.Invoker:对InvocationHandler的实现,提供inovke方法,实现RPC.Client对RPC.Server对象的调用。
RPC.Invocation:用来序列化和反序列化RPC.Client的调用信息(主要跟前面讲的动态代理和Java反射机制有关)
RPC Client主要流程
每一个Call都是由RPC.Client发起的
1.RPC Client 发起RPC Call.通过Java反射机制转化为对Client.call调用
2.调用getConnection得到与RPC Server的连接,每一个RPC Client 都维护一个HashMap结构的到RPC Server的连接池
3.通过Connection将序列化后的参数发送到RPC服务器端
4.阻塞方式等待RPC服务端返回响应
在IPC下面,Server类是个抽象类,唯一抽象的地方是: