1. 程式人生 > >Dubbo消費端呼叫服務端過程分析

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