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;
}
});
本文详细介绍了Dubbo远程调用的过程,包括Invoker发送消息到服务器的具体步骤、线程如何接收服务器返回值以及创建远程调用(Invoker)的流程。通过FailoverClusterInvoker、ListenerInvokerWrapper等组件实现消息发送,利用NettyHandler接收返回结果。
743

被折叠的 条评论
为什么被折叠?



