Dubbo消費端呼叫服務端過程分析
阿新 • • 發佈:2018-12-21
呼叫鏈的整體流程圖
下面藍色部分是消費端的呼叫過程,大致過程分為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