Dubbo消费端调用服务端过程分析
调用链的整体流程图
下面蓝色部分是消费端的调用过程,大致过程分为Proxy–>Filter–>Invoker–>Directory–>LoadBalance–>Filter–>Invoker–>Client
集群容错的架构图
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。
源码分析
dubbo-master consumer代码
public class Consumer {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{ "META-INF/spring/dubbo-demo-consumer.xml"});
context.start();
DemoService demoService = (DemoService) context.getBean("demoService"); // 获取远程服务代理
String hello = demoService.sayHello("world"); // 执行远程方法
System.out.println(hello); // 显示调用结果
}
}
demoService是一个proxy代理类,执行demoService.sayHello方法,其实是调用InvokerInvocationHandler.invoke方法,应该还记得proxy代理类中我们new了一个InvokerInvocationHandler实例
consumer ref初始化分析
com.alibaba.dubbo.config.spring.ReferenceBean
>com.alibaba.dubbo.config.spring.ReferenceBean#getObject
>com.alibaba.dubbo.config.ReferenceConfig#get
>com.alibaba.dubbo.config.ReferenceConfig#init
>com.alibaba.dubbo.config.ReferenceConfig#createProxy
// 注册中心列表
>com.alibaba.dubbo.config.AbstractInterfaceConfig#loadRegistries
>com.alibaba.dubbo.registry.integration.RegistryProtocol#refer
>com.alibaba.dubbo.registry.integration.RegistryProtocol#doRefer
// 注册中心注册
>com.alibaba.dubbo.registry.RegistryService#register
// 注册中心监听
>com.alibaba.dubbo.registry.integration.RegistryDirectory#subscribe
>com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper#refer
>com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper#refer
// dubbo协议的调用
>com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#refer
>com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker
>com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#getClients
// 共享连接
>com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#getSharedClient
// 新连接
>com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#initClient
>com.alibaba.dubbo.remoting.exchange.Exchangers#connect
// 构造refer调用责任链
>com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper#buildInvokerChain
consumer调用分析
>com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler#invoke
>com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker#invoke
>com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke
>com.alibaba.dubbo.rpc.cluster.LoadBalance
>com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke
// 负载均衡
>com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#select
>com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#doselect
>com.alibaba.dubbo.rpc.cluster.LoadBalance#select
// 调用
>com.alibaba.dubbo.rpc.Invoker#invoke
>com.alibaba.dubbo.rpc.protocol.InvokerWrapper#invoke
>com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper#invoke
// 责任链invoke
>com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter#invoke
>com.alibaba.dubbo.monitor.support.MonitorFilter#invoke
>com.alibaba.dubbo.rpc.protocol.AbstractInvoker#invoke
>com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker#doInvoke
>com.alibaba.dubbo.rpc.protocol.dubbo.
ReferenceCountExchangeClient#request
>com.alibaba.dubbo.remoting.exchange.
support.header.HeaderExchangeClient#request
>com.alibaba.dubbo.remoting.exchange.
support.header.HeaderExchangeChannel#request
// 创建DefaultFuture
>new com.alibaba.dubbo.remoting.exchange.
support.DefaultFuture
// NettyChannel 发送数据
>com.alibaba.dubbo.remoting.
transport.netty4.NettyChannel#send
还没有评论,来说两句吧...