dubbo服务发布二之zookeeper注册

接着上一篇继续看。
上一篇服务暴露已经讲完RegistryProtocol#doLocalExport的方法了。下面将服务是如何被写到zookeeper上的。
clipboard.pngjava

一、注册zookeeper节点,/dubbo/*/providers

RegistryProtocol#getRegistry方法中,从最原始的Invoker里面拿到url,拿到配置的“zookeeper”注册协议,从新构造了一个zookeeper协议的registryUrl,并从registryFactory【一个Adaptive类】中拿到一个ZookeeperRegistryFactory实例。
clipboard.png.]设计模式

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的实现方式。
clipboard.pngide

拿到ZookeeperRegistry实例以后,执行抽象类方法AbstractRegistryFactory.getRegistryurl

clipboard.png

ZookeeperRegistry#doRegistry方法,将服务信息,写到zk接口上。
clipboard.pngspa

/dubbo/com.alibaba.dubbo.demo.DemoService/providers都是持久化节点,服务信息是零时节点,主要是为了监听服务提供方的是否断开链接,作出相应处理。
clipboard.png设计

此时该服务的providers节点已经写完了。3d

二、订阅/dubbo/*/configrators节点

红框框里面主要作的时候就是
clipboard.png日志

2.一、建立服务对应的/dubbo/*/configrators节点

建立zk节点【持久型节点】、并监听以下节点
/dubbo
----/com.alibaba.dubbo.demo.DemoService
--------/configuratorscode

2.二、建立一个OverrideListener的监听器

对服务提供者的configurators节点配置监听器。
会触发AbstractRegistry#notify(URL url, NotifyListener listener, List<URL> urls)去写缓存文件,这个之后会单独弄讲。

2.三、订阅/dubbo/*/configrators节点,当有变化时,触发OverrideListener监听器,从新执行OverrideListener#notify方法,

首先在服务提供者的节点树中建立configurators节点,而后配置监听器OverrideListener,若经过Dubbo管理系统为服务设置动态参数,则动态配置的参数放在configurators节点目录下,并通知服务端的OverrideListener监听器,根据动态参数从新生成服务提供者URL,若URL有变化则从新暴露服务

三、返回Exporter

clipboard.png

相关文章
相关标签/搜索