Dubbo概述–其他
寫在前面
本文參考了Dubbo官方手冊結合Dubbo2.6.1版本源碼分析。推薦先閱讀官方手冊。
鑑於個人水平有限,如有不正確的地方請指出,歡迎一起討論,謝謝!
其他
監聽機制
監聽機制包含兩層,一層是Provider、Consumer與Registry的監聽,另一層是業務層監聽。第一層監聽依賴具體的Registry,例如Zookeeper的Watch機制等。此處主要描述業務層監聽。
業務層監聽可以通過實現ExporterListener和InvokerListener接口並通過服務擴展機制注入的方式實現添加。通過ProtocolListenerWrapper類實例化的ListenerExporterWrapper和ListenerInvokerWrapper進行通知監聽的操作。
過濾機制
過濾機制類似Web應用中Filter對Request的過濾。Dubbo中通過ProtocolFilterWrapper將Filter接口的服務擴展類包裝爲Invoker並組裝爲過濾鏈(先加載的先過濾)進行過濾處理。
集羣相關
Dubbo裏的集羣指的是Consumer端從同一個Registry訂閱到的多個相同服務Provider組成的集羣。所以集羣的概念只在Consumer端有意義。
Dubbo中集羣相關的概念包括:
- Cluster,集羣的頂級抽象,用於描述、實現集羣調用方式。
name | invokerClassName | desc |
---|---|---|
failover | FailoverClusterInvoker | 轉移調用。調用失敗後,根據重試次數嘗試調用其他Provider |
available | AvailableCluster匿名內部類 | 可用調用。調用第一個可用的Provider,不重試 |
broadcast | BroadcastClusterInvoker | 廣播調用。調用所有的Provider返回最後一個調用的返回值或最後一個異常 |
failback | FailbackClusterInvoker | 失敗恢復。調用失敗後,使用定時線程池重試調用 |
failfast | FailfastClusterInvoker | 快速失敗。調用一個失敗後,立刻返回 |
failsafe | FailsafeClusterInvoker | 安全調用。調用失敗後,例如日誌,但不會拋出異常,返回空對象 |
forking | ForkingClusterInvoker | 併發調用。使用線程池併發調用多個Provider,返回第一個完成調用的Provider的返回值或異常 |
mergeable | MergeableClusterInvoker | 合併調用。使用線程池併發調用多個Provider,將所有Provider的返回值、異常合併後返回。會用到Merger擴展點。 |
* Directory,Cluster中存儲Provider Proxy Invoker的列表,可以根據訂閱動態更新本地的Invoker。
Router,用於從Directory中獲取Provider Proxy Invoker列表時,根據路由規則過濾Invoker。
LoadBalance,在根據Router獲取了可用的Provider Proxy Invoker列表後,根據LoadBalance獲得負載策略處理後的具體某個Provider Proxy Invoker。
請求分發
請求分發指Provider端接收到請求後,使用何種策略來進行請求處理。通過Dispatcher擴展點指定的dispatcherHandler指定。默認爲AllDispatcher指定的AllChannelHandler進行分發。
在請求分發時,分發的不只是請求Request,還有相關的傳輸事件,例如打開、斷開、異常。
name | handler | desc |
---|---|---|
all | AllChannelHandler | 將所有請求、事件都分發到ThreadPool擴展點指定的線程池中,如果ThreadPool指定的線程池已關閉或不存在則使用默認的一個cached線程池 |
connection | ConnectionOrderedChannelHandler | 將所有請求、異常都分發到ThreadPool擴展點指定的線程池中。而事件發送到只有一個工作線程的線程池內按調用接收順序逐個執行 |
direct | 無 | 不使用多線程,在當前的接收線程(IO線程)上直接處理所有事件、請求 |
execution | ExecutionChannelHandler | 將所有請求、事件都分發到ThreadPool擴展點指定的線程池中 |
message | MessageOnlyChannelHandler | 只將所有請求都分發到ThreadPool擴展點指定的線程池中,事件直接由接收線程(IO線程)處理 |
URL參數
URL在Dubbo中不只是串聯Provider和Consumer,更是Provider或Consumer內部服務擴展注入、業務邏輯處理等方面的重要依賴條件。URL的結構爲:protocol://ip:port?name1=value1&…&nameN=valueN。根據URL參數的作用分爲外部參數和內部參數,外部參數用於Provider、Consumer、Registry、Monitor之間的數據傳輸,內部參數用於組件內部的邏輯處理或確定擴展服務的具體服務類。
默認擴展類
默認擴展類實現是指ExtensionLoader.createAdaptiveExtensionClassCode()方法返回的、在運行時動態生成、根據內部方法參數(一般爲URL)確定返回具體擴展服務的類,全類名爲:擴展點$Adaptive。
擴展點 | 內部邏輯 |
---|---|
com.alibaba.dubbo.cache.CacheFactory | 根據Invocation的methodName返回值,從URL中獲取methedName.cache參數的值,獲取實際的CacheFactory並調用CacheFactory的對應方法,默認爲LruCacheFactory |
com.alibaba.dubbo.validation.Validation | 根據URL中的validation參數獲取實際的Validation並調用實際Validation的對應方法,默認爲JValidation |
com.alibaba.dubbo.rpc.ProxyFactory | 根據URL中的proxy參數獲取實際的ProxyFactory並調用實際ProxyFactory的對應方法,默認爲JavassistProxyFactory |
com.alibaba.dubbo.registry.RegistryFactory | 根據URL屬性中的Protocol獲取實際的Protocol並調用實際的Protocol的對應方法,默認爲DubboProtocol |
com.alibaba.dubbo.rpc.Protocol | 根據URL屬性中的Protocol獲取實際的RegistryFactory並調用實際的RegistryFactory的對應方法,默認爲DubboRegistryFactory |
com.alibaba.dubbo.remoting.Transporter | 根據URL中的client/server參數獲取實際的Transporter並調用實際Transporter的對應方法,默認爲NettyTransporter(不是Netty4的) |
com.alibaba.dubbo.remoting.Dispatcher | 根據URL中的dispather參數獲取實際的Dispatcher並調用實際Dispatcher的對應方法,默認爲AllDispatcher |
com.alibaba.dubbo.common.threadpool.ThreadPool | 根據URL中的threadpool參數獲取實際的ThreadPool並調用實際ThreadPool的對應方法,默認爲FixedThreadPool |
com.alibaba.dubbo.remoting.zookeeper.ZookeeperTransporter | 根據URL中的client參數獲取實際的ZookeeperTransporter並調用實際ZookeeperTransporter的對應方法,默認爲CuratorZookeeperTransporter |
com.alibaba.dubbo.rpc.cluster.Cluster | 根據URL中的cluster參數獲取實際的Cluster並調用實際Cluster的對應方法,默認爲FailoverCluster |
com.alibaba.dubbo.rpc.cluster.RouterFactory | 根據URL屬性中的Protocol獲取實際的RouterFactory並調用實際的RouterFactory的對應方法,無默認 |
com.alibaba.dubbo.rpc.cluster.ConfiguratorFactory | 根據URL屬性中的Protocol獲取實際的RouterFactory並調用實際的RouterFactory的對應方法,無默認 |