dubbo做爲消費者註冊過程分析

請支持原創:
http://www.cnblogs.com/donlianli/p/3847676.html
 
做者當前分析的版本爲2.5.x。做者在分析的時候,都是帶着疑問去查看代碼,debug進行調試的,筆者寫此文章僅供參考。
先大概瞭解一下系統做爲一個消費者從啓動到註冊完成的過程
  1. 系統啓動時,引用service時首先將系統自己本身須要引用的服務註冊到zookeeper,而後訂閱系統須要的服務,最後,會接收到zookeeper發送的訂閱信息。好比一個消費者註冊了一個UserService,系統在啓動時,首先聲明本身是UserService的一個消費者,而後再向zookeeper聲明本身須要訂閱UserService,最後,從zookeeper接收訂閱的服務,而後存儲到本地。
  2. 若是同時引用多個接口,則上面的服務會重複執行屢次。
  3. montitorService是在執行的時候,才執行訂閱。
 
問題:
一、dubbo是經過哪一個類跟zookeeper進行交互的?
二、dubbo把訂閱的信息存儲到了哪一個類?
 

RegistryProtocol.doRefer這裏面進行的註冊,將調用FailbackRegistry.registry進行真正的註冊,實際跟zookeeper進行交互,調用的是ZookeeperRegistry的doRegistry方法。若是註冊失敗,會將url添加定定時任務中進行重試。html

 
AbstractRegistry.notify真正接收到zookeeper的通知。在那兒將notify接口添加到zookeeper的改變事件的呢?
在ZookeeperRegistry代碼的doSubscribe方法中(與zookeeper進行交互的代碼中),將訂閱的接口發送給zookeeper,而且從zookeeper取得可用的服務列表。
ZookeeperRegistry代碼:
zkClient.create(path, false);
//這個是zookeeper返回客戶端訂閱的服務
 List<String> children = zkClient.addChildListener(path, zkListener);
  if (children != null) {
                     urls.addAll(toUrlsWithEmpty(url, path, children));
 }
在循環以外,將已經可用的列表進行通知。
  notify(url, listener, urls);,調用了AbstractRegistry.notify

 

 
 
AbstractRegistry在收到通知後,將url進行存儲,繼續通知NotifyListener。
NotifyListener是在哪兒放入Registry的呢?
在RegistryProtocol訂閱服務的時候,會調用RegistryDirectory.subscribe方法。RegistryDirectory這類自己就實現了NotifyListener接口,在調用FailbackRegistry的subscribe方法的時候,把本身當成一個參數傳遞給了AbstractRegistry對象。因此AbstractRegistry在收到通知後,繼續通知的是RegistryDirectory。
 
RegistryDirectory這個類維護着從本地方法到遠程方法的映射關係,遠程參數到本地方法的調用關係等。
在註冊過程當中的幾個主要類
ZookeeperRegistry:負責與zookeeper進行交互
RegistryProtocol:從註冊中心獲取可用服務,或者將服務註冊到zookeeper,而後提供服務或者提供調用代理。
RegistryDirectory:維護着全部可用的遠程Invoker或者本地的Invoker。這個類實現了NotifyListner。
NotifyListener:負責RegistryDirectory和ZookeeperRegistry的通訊。
FailbackRegistry:繼承自Registry,實現了失敗重試機制。
 
回答一開始的問題
一、經過 ZookeeperRegistry和Zookeeper進行交互,相關的類還有ZookeeperClient,ZkclientZookeeperClient和org.I0Itec.zkclient.ZkClient類。經過這些類的方法,實現服務的註冊和訂閱及信息的傳遞。
二、主要是AbstractRegistry和RegistryDirectory這兩個類。其中RegistryDirectory存儲的可供客戶端直接調用的Invoker,而AbstractRegistry這個類主要存儲的是已經註冊的服務接口,已經訂閱的服務接口和已經收到通知的接口的URL,不能直接調用。
 
 
關於我, 邯鄲人
對這類話題感興趣?歡迎發送郵件至 donlianli@126.com
相關文章
相關標籤/搜索