Dubbo源碼分析(六)----Reference啓動過程分析

本篇是基於Dubbo的2.7.3-release版本.
下圖是來自Dubbo官方的的消費者調用時序圖 數組

從上一篇 消費者啓動過程分析中,經過JDK的動態代理對象,傳入的InnvokeHandler是ReferenceBeanInvocationHandler,這裏經過調用注入的@Reference的代理會觸發invoke方法的調用,這裏的bean對象是觸發真實代理對象的分調用.
經過ReferenceBean中get方法中獲取經過init方法初始化生成代理對象.
ReferenceBeanInvocationHandler中bean就是經過init方法中的createProxy方法中生成代理代理對象.
ReferenceBean中Protocol是Protocol@Adaptive(SPI對象生成適配類),調用調用refer方法獲得Invoker對象,這裏使用到Dubbo的SPI機制特性,若是有註冊中心這Protocol加載的擴展協議是RegsitryProtocol,因爲Protocol註冊有ProtocolFilterWrapper和ProtocolListenerWrapper包裝類,全部執行順序是ProtocolListenerWrapper.refer()--->ProtocolFilterWrapper.refer()--->RegistryProtocol.refer()這種執行順序執行.
首先會調用ProtocolListenerWrapper的refer方法,這裏判斷URL的Protocol中的協議是不是Registry的協議,則調用protoco(這裏注入的protocol是ProtocolFilterWrapper)的refer方法
而後調用ProtocolFilterWrapper中refer方法,這裏判斷URL的Protocol中的協議是不是Registry的協議,因爲咱們配置了zookeeper的註冊中心,這裏第一個if判斷是true,而且這裏注入的對象是RegistryProtocol中,並執行RegistryProtocol.refer方法返回Invoker對象.
RegistryProtocol的refer方法,這裏首先會刪除了URL參數中registry的key,並設置協議爲Dubbo,接着判斷是否註冊的信息是不是RegistryService類型的bean,若是是經過ProxyFactoy包裝成Invoker返回,而後判斷@Reference是否配置group.而後調用doRefer進行服務引用.
建立的RegistryDirectory去註冊服務消費者,而且對服務的路由、配置、提供者信息變動的更新.最後經過注入的Cluster(集羣的特性後面會詳細講)這個擴展點,調用join方法對多個服務的合併轉換成Invoker,並將其註冊到ProviderConsumerRegTable這個對象中.
AbstractProtocol中refer方法中protocolBindingRefer方法是抽象方法,是具體協議對象,默認DubboProtocol去實現了protocolBindingRefer方法.若是是是否group,最後調用doRefer方法
這裏doRefer方法是經過RegistryDirectory向註冊中心註冊元數據信息,而且訂閱註冊中心提供者信息,而後經過Cluster.join合併成一個Invoker,默認集羣策略是FailOver的,因此這裏返回的Invoker對象是FailoverClusterInvoker
服務訂閱時,會經過獲取註冊中心的提供者的URL,並默認使用DubboPrtocol的refer方法從新引用一次
Dubbo中的protocolBindingRefer方法,構建一個DubboInvoker對象,其中第三個參數是獲取ExchangeClient[]數組,消費端的遠程調用通訊就是它完成的(默認是Netty),
這裏就是ProxyFactory調用getProxy方法獲取的代理對象,這裏ProxyFactory注入是實例對象是ProxyFactroy$Adaptive對象,默認是使用JavassistProxyFactory生成Invoker.
JavassistProxyFactory的getProxy主要是將經過Protocol轉換成的Invoker.經過Dubbo本身實現的Proxy生成代理類.注入到Spring容器中Bean標註@Reference中屬性和方法中.
經過調用@Reference的bean方法調用,最終會調用InvokerInvocationHandler的invoke方法,該方法裏面是調用Invoker的invoke方法,經過傳入RpcInvocation對象,傳入method和參數等,經過ExchangeClient調用遠程的方法並返回

總結:
今天主要是分析Reference執行啓動的流程,以及調用的過程,markdown

相關文章
相關標籤/搜索