接着上一篇继续看。
上一篇服务暴露已经讲完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有变化则从新暴露服务