Dubbo-聊聊注册中心的设计( 六 )

注册/订阅AbstractRegistry 实现了 Registry 接口,当新节点注册进来时候registry() 方法,会将当前节点要注册的 URL缓存到 registered集合,当节点下线时候,unregistry() 方法会从 registered 集合删除指定的 URL 。当消费者新增加一个订阅的时候,subscribe() 方法会将当前节点作为 Consumer 的 URL 以及相关的 NotifyListener 记录到 subscribed 集合,当消费者取消一个订阅的时候,unsubscribe() 方法会将当前节点的 URL 以及关联的 NotifyListener 从 subscribed 集合删除 。这四个方法相对比较简单,这里不做展示,此处设计为抽象类,当子类重写的时候可以对其进行增强 。
恢复/销毁当因为网络问题与注册中心断开连接之后,会进行重连,重新连接成功之后,会调用 recover() 方法将 registered 集合中的全部 URL 重新执行register() 方法,恢复注册数据 。同样,recover() 方法也会将 subscribed 集合中的 URL 重新执行subscribe() 方法,恢复订阅监听器 。当前节点下线的时候,destroy() 方法会调用 unregister() 方法和 unsubscribe() 方法将当前节点注册的 URL 以及订阅的监听全部清理掉,此外还会销毁本实例 。
    public void destroy() {        if (logger.isInfoEnabled()) {            logger.info("Destroy registry:" + getUrl());        }        Set<URL> destroyRegistered = new HashSet<>(getRegistered());        if (!destroyRegistered.isEmpty()) {            for (URL url : new HashSet<>(destroyRegistered)) {                if (url.getParameter(DYNAMIC_KEY, true)) {                    try {                        //取消注册                        unregister(url);                        if (logger.isInfoEnabled()) {                            logger.info("Destroy unregister url " + url);                        }                    } catch (Throwable t) {                        logger.warn("Failed to unregister url " + url + " to registry " + getUrl() + " on destroy, cause: " + t.getMessage(), t);                    }                }            }        }        Map<URL, Set<NotifyListener>> destroySubscribed = new HashMap<>(getSubscribed());        if (!destroySubscribed.isEmpty()) {            for (Map.Entry<URL, Set<NotifyListener>> entry : destroySubscribed.entrySet()) {                URL url = entry.getKey();                for (NotifyListener listener : entry.getValue()) {                    try {                        //取消订阅                        unsubscribe(url, listener);                        if (logger.isInfoEnabled()) {                            logger.info("Destroy unsubscribe url " + url);                        }                    } catch (Throwable t) {                        logger.warn("Failed to unsubscribe url " + url + " to registry " + getUrl() + " on destroy, cause: " + t.getMessage(), t);                    }                }            }        }        //移除注册中心        AbstractRegistryFactory.removeDestroyedRegistry(this);    }

经验总结扩展阅读