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

Posted 全力付出

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dubbo版本2.8.4 消费者远程调用过程相关的知识,希望对你有一定的参考价值。

dubbo远程调用过程

一、Invoker发送消息到服务器

  1. 首先是FailoverClusterInvokerinvoke()方法
  2. FailoverClusterInvokerdoInvoke()方法选择负载均衡(loadbalance)方式调用后续方法
  3. InvokerWrapperinvoke()方法
  4. FutureFilterinvoke方法拦截后续invoke方法,并设置异步或同步返回值
  5. ListenerInvokerWrapperinvoke()方法
  6. DubboInvokerdoInvoke()方法使用HeaderExchangeClient(netty实现)发送请求,最后采用ExchangeCodecencodeRequest()方法序列化(默认序列化协议hessian2)数据
  7. DefaultFuture异步阻塞线程RemotingInvocationTimeoutScan检测是否超时,设置callback接收返回值

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

  1. NettyHandlermessageReceived()方法接收消息,传递给AllChannelHandler处理
  2. AllChannelHandlerreceived()方法启动ChannelEventRunnable线程接收服务端RECEIVED事件
  3. DecodeHandler将结果解码(decode)
  4. HeaderExchangeHandlerreceived()方法接收返回结果
  5. DefaultFuturereceived()方法设置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)流程图

四、参考

  1. http://www.tuicool.com/articles/z6BzIn7
  2. https://github.com/dangdangdotcom/dubbox

以上是关于dubbo版本2.8.4 消费者远程调用过程的主要内容,如果未能解决你的问题,请参考以下文章

Dubbo-服务消费者远程调用

Dubbo 服务调用过程源码分析

分布式框架之通过Dubbo来实现服务消费方远程调用服务提供方的方法

dubbo调用过程分析

Dubbo源码解析:网络通信

Springboot整合Dubbo和Zookeeper