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()
- 数据相关方法
- 监听相关方法
#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; } // ... 省略其他方法 } |