Dubbo Invoker概述----服務發現、集羣、負載均衡、路由體系

Invoker,負載網絡調用組件,底層依懶與網絡通訊,Invoker主要負責服務調用,天然與路由(好比集羣)等功能息息相關,本節先從總體上把控一下Dubbo服務調用體系,服務發現、集羣、負載均衡、路由機制等整個知識體系,梳理整理Dubbo Invoker整個類圖以下:算法

這裏寫圖片描述

主要有以下接口羣數組

  1. Invocation(調用上下文環境)
  • Invocation:
    • String getMethodName() 獲取調用方法名。
    • Class< ? >[] getParameterTypes()
      獲取被調用方法的參數列表(參數類型)
    • Object[] getArguments() 獲取被調用方法的參數值數組。
    • Map< String, String> getAttachments() 獲取附加屬性。
    • String getAttachment(String key) 根據key獲取附加屬性值。
    • String getAttachment(String key, String defaultValue) 根據key獲取附加屬性,若是不存在,取默認值。
    • Invoker< ?> getInvoker() 獲取當前的invoker。
  • RpcInvocation rpc服務調用實現類 Invocation執行調用上下文環境,就是用一個Bean存儲當前調用方法的參數,其本質就是一個普通的Bean而已。
  • MockInvocation 用於mock單元測試用。
  • DecodeableRpcInvocation 帶解碼功能的rpc調用上下文 該實現主要能從RPC服務調用請求中解析二進制流(二進制包)獲得RPC服務調用上下文(方法調用元數據)。
  1. Invoker 服務調用器,Dubbo中調用服務的抽象。

Invoer的抽象接口,繼承自com.alibaba.dubbo.common.Node接口服務器

  • Node:
    • URL getUrl(); 獲取URL,在dubbo中,註冊中心、服務提供者、服務消費者、監控中心等都使用URL描述。
    • boolean isAvailable() :判斷是否可用。
    • void destroy() :資源銷燬。
  • Invoker:
    • Class<t> getInterface() :獲取服務提供者的接口。 Result invoke(Invocation invocation) throws RpcException :調用服務,返回調用結果。
  • AbstractInvoker Invoker默認實現(模板類) 該方法主要實現public Result invoke(Invocation inv) throws RpcException,定義執行invoker的基礎流程(模板),而後根據不一樣的實現子類(不一樣的協議)執行各自個性化的執行任務。其抽象方法:protected abstract Result doInvoke(Invocation invocation) throws Throwable,具體實現將在後文中分析。
  • DubboInvoker dubbo協議調用器具體實現。
  • InjvmInvoker injvm協議調用其具體實現(本地協議)
    • AbstractClusterInvoker 集羣模式調用模板類 該類爲Dubbo集羣模式的調用模板類,主題解決一個服務服務有多個服務提供者,此時消息消費端在調用服務時如何選擇具體的服務提供者。該類須要組織多個服務提供者,並按照指定算法選擇一服務提供者進行調用。
  • AvailableClusterInvoker 經過< dubbo:service cluster = "available" .../> 或 < dubbo:reference cluster="available" .../> 集羣策略:老是選擇第一個可用的服務提供者。
  • BroadcastClusterInvoker 經過< dubbo:service cluster = "broadcast" .../> 或 < dubbo:reference cluster="broadcast" .../> 集羣策略:廣播模式,向全部服務提供者都發送請求,任何一個調用失敗,則認爲失敗。
  • FailbackClusterInvoker 經過< dubbo:service cluster = "failback" .../> 或 < dubbo:reference cluster="failback" .../> 集羣策略:服務調用失敗後,定時重試,重試次數無線次,重試頻率:5s。並不會切換服務提供者。
  • FailfastClusterInvoker 經過< dubbo:service cluster = "failfast" .../> 或 < dubbo:reference cluster="failfast" .../> 集羣策略:服務調用後,快速失敗,直接拋出異常,並不重試,也不受retries參數的制約,適合新增、修改類操做。
  • FailoverClusterInvoker 經過< dubbo:service cluster = "failover" .../> 或 < dubbo:reference cluster="failover" .../> 集羣策略:服務調用後,若是出現失敗,則重試其餘服務提供者,默認重試2次,總共執行3次,重試次數由retries配置,dubbo集羣默認方式。
  • FailsafeClusterInvoker 經過< dubbo:service cluster = "failsafe" .../> 或 < dubbo:reference cluster="failsafe" .../> 集羣策略:服務調用後,只打印錯誤日誌,而後直接返回。
  • ForkingClusterInvoker
    經過< dubbo:service cluster = "forking" .../> 或 < dubbo:reference cluster="forking" .../> 集羣策略:併發調用多個服務提供者,取第一個返回的結果。能夠經過forks設置併發調用的服務檯提供者個數。

更多的集羣策略,能夠參考/dubbo-cluster/src/main/resources/META-/com.alibaba.dubbo.rpc.cluster.Cluster文件。 這裏寫圖片描述網絡

  1. LoadBalance 集羣負載算法 當一個服務有多個服務提供者時,消費端在進行服務調用時選擇服務服務提供者的負載均衡算法。 LoadBalance定義的接口爲: < T> Invoker<t> select(List< Invoker<t>> invokers, URL url, Invocation invocation) throws RpcException;
  • ConsistentHashLoadBalance 能夠經過< dubbo:service loadbalance="consistenthash" .../>或< dubbo:provider loadbalance = "consistenthash" .../> 負載均衡算法:一致性Hash算法,在AbstractClusterInvoker中從多個服務提供者中選擇一個服務提供者時被調用。
  • LeastActiveLoadBalance 能夠經過< dubbo:service loadbalance="leastactive" .../>或< dubbo:provider loadbalance = "leastactive" .../> 負載均衡算法:最小活躍調用。
  • RandomLoadBalance 能夠經過< dubbo:service loadbalance="random" .../>或< dubbo:service loadbalance = "random" .../> 負載均衡算法:隨機,若是weight(權重越大,機會越高)
  • RoundRobinLoadBalance 能夠經過< dubbo:service loadbalance="roundrobin" .../>或< dubbo:provider loadbalance = "roundrobin" .../> 負載均衡算法:加權輪詢算法。
  • Directory(目錄服務,Invoker的目錄服務) 該接口主要的做用是服務提供者的目錄服務,管理多個服務提供者。
  • Directory
    • Class< T> getInterface() 獲取該服務接口類別。
    • List< Invoker< T>> list(Invocation invocation) throws RpcException 根據調用上下文獲取當前全部該服務的服務提供者。

4.2 AbstractDirectory 目錄服務實現的抽象列(模板類)架構

4.3 StaticDirectory 靜態目錄服務併發

所謂靜態目錄服務就是在建立StaticDirectory時指定一個服務提供者集合,則該目錄服務實例在其生命週期中,只會返回這些服務提供者。負載均衡

  • RegistryDirectory 動態目錄服務(基於註冊中心)、 從註冊中心動態獲取發現服務提供,默認消息消費者並不會指定特定的服務提供者URL,因此會向註冊中心訂閱服務的服務提供者(監聽註冊中心providers目錄),利用RegistryDirectory自動獲取註冊中心服務器列表。
  • Router 路由功能 根據消息消費者URL,結合路由表達式或JS引擎,從Directory中選擇符合路由規則的Invoker,再執行負載均衡算法。
  • Router
    • URL getUrl(); 獲取消息消費者URL。
    • 二、< T> List< Invoker< T>> route(List< Invoker< T>> invokers, URL url, Invocation invocation) throws RpcException 根據消息消費者URL,從invokers中篩選合適的Invokers。
  • ConditionRouter 基於條件表達式的路由實現。
  • ScriptRouter 基於JS引擎的路由實現。

單個Invoker的實現,例如DubboInvoker、InJVMInvoker底層調用網絡通道發送請求命令(oneway、同步、異步調用方式),其網絡底層細節將在後續專門講解網絡實現篇章重點分析,接下來的篇章,主要從源碼的角度剖析集羣、負載均衡、動態路由目錄服務(RegistryDirectory )的實現細節。dom


做者介紹:丁威,《RocketMQ技術內幕》做者,RocketMQ 社區佈道師,公衆號:中間件興趣圈 維護者,目前已陸續發表源碼分析Java集合、Java 併發包(JUC)、Netty、Mycat、Dubbo、RocketMQ、Mybatis等源碼專欄。能夠點擊連接:中間件知識星球,一塊兒探討高併發、分佈式服務架構,交流源碼。異步

</t></t></t>jvm

相關文章
相關標籤/搜索