前面两篇文章已经分析了provider和consumer之间的通信过程,那么还有几个问题:
- 由于请求是异步的,provider返回结果到客户端之后,consumer怎么知道该结果是哪个请求的?
- 由于请求是异步的,为何Dubbo能同步等待结果?
由于请求是异步的,provider返回结果到客户端之后,consumer怎么知道该结果是哪个请求的?
先看下第一个问题,因为provider返回结果也是一次网络请求,那么切入点自然也是Handler,看下哪个Handler处理了Response,从上篇文章中的NettyServer结构图中一个个Handler查看,发现HeaderExchangeHandler有做处理,主要是received方法
public void received(Channel channel, Object message) throws RemotingException {
channel.setAttribute(KEY_READ_TIMESTAMP, System.currentTimeMillis());
ExchangeChannel exchangeChannel = HeaderExchangeChannel.getOrAddChannel(channel);
try {
if (message instanceof Request) {
//....
} else if (message instanceof Response) {
handleResponse(channel, (Response) message);
} else if (message instanceof String) {
//....
} else {
handler.received(exchangeChannel, message);
}
}catch (Exception e){
logger.error(e);
}finally {
HeaderExchangeChannel.removeChannelIfDisconnected(channel);
}
}
如果接收到的对象是Response类型的,那么交由handleResponse进行处理
static void handleResponse(Channel channel, Response response) throws RemotingException {
if (response != null && !response.isHeartbeat()) {
// 如果不是心跳信息
DefaultFuture.received(channel, response);
}
}
DefaultFuture
public static void received(Channel channel, Response