源头:
在ProtobufRpcEngine.Invoker的invoke()方法中会调用client.call()方法。
-
将RPC请求信息封装成一个Call对象
-
创建Connection对象管理客户端和服务端的Socket连接
-
Call对象会放入Connection.calls字段中
-
Connection对象会放入Client.connections字段中以供复用。
-
-
通过Connection.setupIOstreams()方法建立客户端与服务端的Socket的连接
-
setupIOstreams()方法还会启动Connection线程,该线程的作用是监听Socket中服务端返回的响应信息
-
通过Connection.sendRpcRequest()方法发送RPC请求到Server。
在2.8.5的源码中,call方法有两种模式可以选择:一种是同步的,一种是异步的,同步的就是等待服务端返回响应结果再返回;异步的就是先返回null,等服务端返回响应后再获得结果。
我们先讨论一下同步的情况。
同步模式
Call
从上面的流程中,我们可以发现发送请求和接受响应是由两个独立的线程进行的。发送请求线程就是调用Client.call()方法的线程,而接收响应线程则是在建立Socket连接后启动的Connection线程。在同步模式下,这两个线程是怎么配合的呢?这里就用到了Call类。发送请求线程在发送请求到Server后会在请求对应的Call对象上调用Call.wait()方法等待Server发回响应信息。接收响应线程当监听到服务端返回响应信息后会首先设置