接着上一篇繼續看。
上一篇服務暴露已經講完RegistryProtocol#doLocalExport的方法了。下面將服務是如何被寫到zookeeper上的。java
RegistryProtocol#getRegistry方法中,從最原始的Invoker裏面拿到url,拿到配置的「zookeeper」註冊協議,從新構造了一個zookeeper協議的registryUrl,並從registryFactory【一個Adaptive類】中拿到一個ZookeeperRegistryFactory實例。.]設計模式
RegistryFactory$Adpative代碼【獲取方法:把日誌級別調測DEBUG,而後從控制檯裏面找到該端代碼】緩存
package com.alibaba.dubbo.registry; import com.alibaba.dubbo.common.extension.ExtensionLoader; public class RegistryFactory$Adpative implements com.alibaba.dubbo.registry.RegistryFactory { public com.alibaba.dubbo.registry.Registry getRegistry(com.alibaba.dubbo.common.URL arg0) { if (arg0 == null) throw new IllegalArgumentException("url == null"); com.alibaba.dubbo.common.URL url = arg0; String extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol()); if (extName == null) throw new IllegalStateException("Fail to get extension(com.alibaba.dubbo.registry.RegistryFactory) name from url(" + url.toString() + ") use keys([protocol])"); com.alibaba.dubbo.registry.RegistryFactory extension = (com.alibaba.dubbo.registry.RegistryFactory) ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.registry.RegistryFactory.class).getExtension(extName); return extension.getRegistry(arg0); } }
執行ZookeeperRegistryFactory#getRegistry【模板設計模式,對不對?!】方法,並調用ZookeeperRegistryFactory#createRegistry,在ZookeeperRegistryFactory已經利用dubbo的IOC原理,注入了一個ZookeeperTransporter,該對象利用Adaptive機制得到一個zookeeper客戶端的實例,默認使用zkClinet的實現方式。ide
拿到ZookeeperRegistry實例以後,執行抽象類方法AbstractRegistryFactory.getRegistryurl
ZookeeperRegistry#doRegistry方法,將服務信息,寫到zk接口上。spa
/dubbo/com.alibaba.dubbo.demo.DemoService/providers都是持久化節點,服務信息是零時節點,主要是爲了監聽服務提供方的是否斷開鏈接,作出相應處理。設計
此時該服務的providers節點已經寫完了。3d
紅框框裏面主要作的時候就是日誌
建立zk節點【持久型節點】、並監聽以下節點
/dubbo
----/com.alibaba.dubbo.demo.DemoService
--------/configuratorscode
對服務提供者的configurators節點配置監聽器。
會觸發AbstractRegistry#notify(URL url, NotifyListener listener, List<URL> urls)去寫緩存文件,這個之後會單獨弄講。
首先在服務提供者的節點樹中建立configurators節點,而後配置監聽器OverrideListener,若經過Dubbo管理系統爲服務設置動態參數,則動態配置的參數放在configurators節點目錄下,並通知服務端的OverrideListener監聽器,根據動態參數從新生成服務提供者URL,若URL有變化則從新暴露服務