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