Hadoop源码分析7: IPC流程(2) 流程

本文深入解析了RPC协议在服务器端和客户端之间的通信流程,包括服务器启动、客户端连接、发送请求、服务器接收处理和响应流程,以及客户端接收响应的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.服务器端启动流程

(1) RPC类构建Server对象,Server对象包括Server.Listener 线程  
(2) 构建Server.Listener 线程,acceptChannel.socket绑定IP和端口,acceptChannel注册到selector接收事件
(3) Server.Listener 线程包括若干Server.Listener.Reader 线程,构建并运行Server.Listener.Reader线程
(4) Server对象包括Server.Responder 线程,构建Server.Responder线程
(5) Server.Listener 线程运行,Server.Responder 线程运行,构建若干Server.Handler 线程并运行


2.客户端连接流程

(1) RPC返回实现VersionedProtocol代理,需要构建一个RPC.Invoker对象
(2)RPC.Invoker对象包含一个RPC.ConnectionId对象,构建的RPC.ConnectionId对象里面填写了地址、协议等信息
(3) RPC.Invoker对象包含一个Client对象,构建的Client对象,
(4) 请求版本信息,对比版本,此时开始真正的连接

3.客户端发送流程(请求版本信息)
(1)客户端代理调用RPC.Invoker对象的invoke()方法(使用动态代理调用)
(2)此时根据请求参数构建一个RPC.Invocation对象并传送,也传送RPC.ConnectionId对象
  (3) RPC.Invoker.invoke()实际方法中调用  Client 对象的call() 方法
 (4)  Client. call()   方法根据RPC.Invocation对象构建Client.Call()对象
  (5)  Client. call()   方法构建 Client.Connection线程
  (6) Client.Connection 线程  包括一个ConnectionHeader对象,构建它
(7)将RPC.ConnectionId对象和Client.Connection 线程  放入字段Client.connections字段 (一个HashMap)中,作为缓存
  (8)将  Client.Call()对象放入Client.Connection 线程的calls字段中
(9)进行Socket连接,
(10)向Socket写入头信息RPCHeader信息(字符串"hrpc")
(11)向Socket写入头信向Socket写入头信息RPCHeader信息(字符串"hrpc")
(12)启动Client.Connection线程
(13)向Socket写入正式请求(Client.Call()对象),之后等待完成(看call.done是否为真)

4.服务器端接收、处理、发送流程
(1) Server. Listener  线程监测到连接请求的SocketChannel对象
(2) Server. Listener.Reader  线程的readSelector注册到SocketChannel对象的读事件
(3) Server . Listener   线程 根据SocketChannel对象 构建Server.Connection对象,并将该对象绑定到readKey
(4) Server . Listener   线程 Server.Connection对象放进Server的connectionList字段
(5) Server . Listener .Reader  线程 监听到读请求的Server.Connection对象,对Server.Connection对象中的channel读取数据,依次读取rpcHeader、ConnectionHeader,根据ConnectionHeader,构建Connection对象的protocal字段,
(6)  Server . Listener .Reader读取真正的请求参数,根据请求参数构建 Server. Call对象,将该对象放入Server.callQueue中
(7)Server.Handler线程从callQueue取得 Server . Call 对象,调用RPC.Server.call()方法处理Call
(8) RPC.Server.call()方法根据 Server . Call 对象的字段,构建RPC.Invocation对象,使用参数通过反射调用真正方法
(9)Server.Handler线程将结构保留在 Server . Call 对象的字段value中,将 Server . Call  放在  Server.Connection对象的responseQueue中
(10)若responseQueue中只有一个 Server . Call,Server.Handler线程将直接处理 Server . Call发送到客户端
(11)若 responseQueue中有多个 Server . Call,线程Server.Response会将从responseQueue中取出处理
 
5.客户端接收流程

(1)Client.Connection线程从输入流中读取到数据,将call.done设为真,线程运行结束
(2)主线程监测到call.done为真,将call.value返回。


 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值