您的位置:首页 > 其它

dubbo版本2.8.4 消费者远程调用过程

2017-05-26 13:16 411 查看

dubbo远程调用过程

一、Invoker发送消息到服务器

首先是
FailoverClusterInvoker
invoke()
方法

FailoverClusterInvoker
doInvoke()
方法选择负载均衡(loadbalance)方式调用后续方法

InvokerWrapper
invoke()
方法

FutureFilter
invoke
方法拦截后续
invoke
方法,并设置异步或同步返回值

ListenerInvokerWrapper
invoke()
方法

DubboInvoker
doInvoke()
方法使用
HeaderExchangeClient
(netty实现)发送请求,最后采用
ExchangeCodec
encodeRequest()
方法序列化(默认序列化协议
hessian2
)数据

DefaultFuture
异步阻塞线程
RemotingInvocationTimeoutScan
检测是否超时,设置
callback
接收返回值

二、线程接收服务器返回值

NettyHandler
messageReceived()
方法接收消息,传递给
AllChannelHandler
处理

AllChannelHandler
received()
方法启动
ChannelEventRunnable
线程接收服务端
RECEIVED
事件

DecodeHandler
将结果解码(decode)

HeaderExchangeHandler
received()
方法接收返回结果

DefaultFuture
received()
方法设置
callback
返回值

NettyHandler
设置netty client里

ClientBootstrap bootstrap = new ClientBootstrap(channelFactory);
// config
// @see org.jboss.netty.channel.socket.SocketChannelConfig
bootstrap.setOption("keepAlive", true);
bootstrap.setOption("tcpNoDelay", true);
bootstrap.setOption("connectTimeoutMillis", getTimeout());
final NettyHandler nettyHandler = new NettyHandler(getUrl(), this);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
public ChannelPipeline getPipeline() {
NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec(), getUrl(), NettyClient.this);
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", adapter.getDecoder());
pipeline.addLast("encoder", adapter.getEncoder());
pipeline.addLast("handler", nettyHandler);
return pipeline;
}
});


三、创建远程调用(Invoker)流程图



四、参考

http://www.tuicool.com/articles/z6BzIn7

https://github.com/dangdangdotcom/dubbox
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: