Dubbo十八:Zookeeper 客户端

1. 概述

在 dubbo-remoting-zookeeper 模块,实现了 dubbo 对 Zookeeper 客户端的封装。在该模块中,抽象了通用的 Zookeeper Client API 接口,实现了两种 Zookeeper Client 库的接入:

  • 基于 Apache Curator 实现。

    <dubbo:registry address="zookeeper://127.0.0.1:2181" client="curator" />
    
  • 基于 ZkClient 实现。

    <dubbo:registry address="zookeeper://127.0.0.1:2181" client="zkclient" />
    

认不配置 client 的情况下,使用 Curator 。


dubbo-remoting-zookeeper 的整体类图如下:

类图

下面,我们按照接口到实现的顺序,往下看。

2. 接口

2.1 StateListener

com.alibaba.dubbo.remoting.zookeeper.StateListener ,状态监听器接口,代码如下:

public interface StateListener {

    /**
     * 状态 - 已断开
     */
    int disCONNECTED = 0;
    /**
     * 状态 - 已连接
     */
    int CONNECTED = 1;
    /**
     * 状态 - 已重连
     */
    int RECONNECTED = 2;

    /**
     * 状态变更回调
     *
     * @param connected 状态
     */
    void stateChanged(int connected);

}

2.2 ChildListener

com.alibaba.dubbo.remoting.zookeeper.StateListener ,节点监听器接口,代码如下:

public interface ChildListener {

    /**
     * 子节点发生变化的回调
     *
     * @param path 节点
     * @param children 最新的子节点列表
     */
    void childChanged(String path, List<String> children);

}

2.3 ZookeeperClient

com.alibaba.dubbo.remoting.zookeeper.ZookeeperClient ,Zookeeper 客户端接口,代码如下:

public interface ZookeeperClient {

    /**
     * 创建节点
     *
     * @param path 节点路径
     * @param ephemeral 是否临时节点
     */
    void create(String path, boolean ephemeral);

    /**
     * 删除节点
     *
     * @param path 节点路径
     */
    void delete(String path);

    List<String> getChildren(String path);

    /**
     * 添加 ChildListener
     *
     * @param path 节点路径
     * @param listener 监听器
     * @return 子节点列表
     */
    List<String> addChildListener(String path, ChildListener listener);

    /**
     * 移除 ChildListener
     *
     * @param path 节点路径
     * @param listener 监听器
     */
    void removeChildListener(String path, ChildListener listener);

    /**
     * 添加 StateListener
     *
     * @param listener 监听器
     */
    void addStateListener(StateListener listener);

    /**
     * 移除 StateListener
     *
     * @param listener 监听器
     */
    void removeStateListener(StateListener listener);

    /**
     * @return 是否连接
     */
    boolean isConnected();

    /**
     * 关闭
     */
    void close();

    /**
     * @return 获得注册中心 URL
     */
    URL getUrl();

}
  • 状态相关方法
    • #isConnected()
    • #close()
    • #getUrl()
  • 数据相关方法
    • #create(path, ephemeral)
    • #getChildren(path)
    • 从 API 上,dubbo 只使用节点的路径,而不使用节点的值(内容)。
  • 监听相关方法
    • #addChildListener(path, listener)
    • #removeChildListener(path, listener)
    • #addStateListener(listener)
    • #removeStateListener(listener)

2.4 AbstractZookeeperClient

com.alibaba.dubbo.remoting.zookeeper.support.AbstractZookeeperClient ,实现 ZookeeperClient 接口,Zookeeper 客户端抽象类,实现通用的逻辑。

2.4.1 属性

public abstract class AbstractZookeeperClient<TargetChildListener> implements ZookeeperClient {

    /**
     * 注册中心 URL
     */
    private final URL url;
    /**
     * StateListener 集合
     */
    private final Set<StateListener> stateListeners = new copyOnWriteArraySet<StateListener>();
    /**
     * ChildListener 集合
     *
     * key1:节点路径
     * key2:ChildListener 对象
     * value :监听器具体对象。不同 Zookeeper 客户端,实现会不同。
     */
    private final ConcurrentMap<String, ConcurrentMap<ChildListener, TargetChildListener>> childListeners = new ConcurrentHashMap<String, ConcurrentMap<ChildListener, TargetChildListener>>();
    /**
     * 是否关闭
     */
    private volatile boolean closed = false;

    public AbstractZookeeperClient(URL url) {
        this.url = url;
    }

    @Override
    public URL getUrl() {
        return url;
    }
    
    // ... 省略其他方法
    
}

相关文章

在网络请求时,总会有各种异常情况出现,我们需要提前处理这...
作者:宇曾背景软件技术的发展历史,从单体的应用,逐渐演进...
hello,大家好呀,我是小楼。最近一个技术群有同学at我,问我...
 一个软件开发人员,工作到了一定的年限(一般是3、4年左右...
当一个服务调用另一个远程服务出现错误时的外观Dubbo提供了多...
最近在看阿里开源RPC框架Dubbo的源码,顺带梳理了一下其中用...