dubbo系列之网络通信-consumer的接收原理

dubbo系列之网络通信-consumer的接收原理

简介

接着上一篇博客往下,在provider完成接收和发送之后,consumer才来接收,过程和provider的接收差不多,但还是有一点细微的区别,我们这篇博客就重点看看区别之处,相同的地方就直接跳过了,可参考上一篇博客。

源码介绍

NettyHandler类

messageReceived()
1
2
3
4
5
6
7
8
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
NettyChannel channel = NettyChannel.getOrAddChannel(ctx.getChannel(), url, handler);
try {
handler.received(channel, e.getMessage());
} finally {
NettyChannel.removeChannelIfDisconnected(ctx.getChannel());
}
}

看一下此时的e.getMessage()的值

e.getMessage

省略一段和provider相同的debug路程,直接进入重点

HeaderExchangeHandler类

handleResponse()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void received(Channel channel, Object message) throws RemotingException {
if (message instanceof Request) {
// handle request.
Request request = (Request) message;
if (request.isEvent()) {
handlerEvent(channel, request);
} else {
if (request.isTwoWay()) {
Response response = handleRequest(exchangeChannel, request);
channel.send(response);
} else {
handler.received(exchangeChannel, request.getData());
}
}
} else if (message instanceof Response) {
handleResponse(channel, (Response) message);
}

区别来了,provider的是Request,而我们从上面的e.getMessage值得图就能看出来,consumer是进入Response循环,接着往下看。

DefaultFuture类

doReceived()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//涉及到异步变同步的锁机制
private void doReceived(Response res) {
lock.lock();//加锁
try {
response = res;//复制
if (done != null) {
done.signal();
}
} finally {
lock.unlock();//解锁
}
if (callback != null) {
invokeCallback(callback);
}
}

一解锁,控制台立马打印

1
[14:05:26] Hello world0, response form provider: 10.1.86.250:20880

这样consumer就拿到了数据了。

涉及到异步转同步得问题下一篇博客再介绍。