dubbo服务发布二之zookeeper注册

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

1、注册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.png

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

clipboard.png

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

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

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

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

红框框里面主要做的时候就是
clipboard.png

2.1、创建服务对应的/dubbo/*/configrators节点

创建zk节点【持久型节点】、并监听如下节点
/dubbo
----/com.alibaba.dubbo.demo.DemoService
--------/configurators

2.2、创建一个OverrideListener的监听器

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

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

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

3、返回Exporter

clipboard.png

你可能感兴趣的:(dubbo,dubbo-zookeeper,rpc,java)