請支援原創:
http://www.cnblogs.com/donlianli/p/3847676.html
作者目前分析的版本為2.5.x。作者在分析的時候,都是帶着疑問去檢視代碼,debug進行調試的,筆者寫此文章僅供參考。
先大概了解一下系統作為一個消費者從啟動到注冊完成的過程
- 系統啟動時,引用service時首先将系統本身自己需要引用的服務注冊到zookeeper,然後訂閱系統需要的服務,最後,會接收到zookeeper發送的訂閱資訊。比如一個消費者注冊了一個UserService,系統在啟動時,首先聲明自己是UserService的一個消費者,然後再向zookeeper聲明自己需要訂閱UserService,最後,從zookeeper接收訂閱的服務,然後存儲到本地。
- 如果同時引用多個接口,則上面的服務會重複執行多次。
- montitorService是在執行的時候,才執行訂閱。
問題:
1、dubbo是通過哪個類跟zookeeper進行互動的?
2、dubbo把訂閱的資訊存儲到了哪個類?
RegistryProtocol.doRefer這裡面進行的注冊,将調用FailbackRegistry.registry進行真正的注冊,實際跟zookeeper進行互動,調用的是ZookeeperRegistry的doRegistry方法。如果注冊失敗,會将url添加定定時任務中進行重試。
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,實作了失敗重試機制。
回答一開始的問題
1、通過ZookeeperRegistry和Zookeeper進行互動,相關的類還有ZookeeperClient,ZkclientZookeeperClient和org.I0Itec.zkclient.ZkClient類。通過這些類的方法,實作服務的注冊和訂閱及資訊的傳遞。
2、主要是AbstractRegistry和RegistryDirectory這兩個類。其中RegistryDirectory存儲的可供用戶端直接調用的Invoker,而AbstractRegistry這個類主要存儲的是已經注冊的服務接口,已經訂閱的服務接口和已經收到通知的接口的URL,不能直接調用。
關于我,邯鄲人。
對這類話題感興趣?歡迎發送郵件至[email protected]