Dubbo消费端调用服务端过程分析

调用链的整体流程图

下面蓝色部分是消费端的调用过程,大致过程分为Proxy–>Filter–>Invoker–>Directory–>LoadBalance–>Filter–>Invoker–>Client

Dubbo消费端调用服务端过程分析

集群容错的架构图

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

Dubbo消费端调用服务端过程分析

源码分析

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