Zookeeper入门编程之对zookeeper节点的增删改查

本文介绍了如何使用Zookeeper的客户端Curator进行Znode的增删改查操作,包括创建节点、查询节点、修改节点值和删除节点。此外,还展示了如何在项目中实现从MySQL数据库到Zookeeper的数据同步功能,提供了一键同步的类代码示例,涉及的身份验证、权限校验、路由和出站通道等节点的同步方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Zookeeper入门编程之对zookeeper节点的增删改查

最近做了一个项目,关于一个访问API的开放平台,其中有很重要的一个模块是从mysql数据库到zookeeper节点的数据同步,这一块是我独立负责的,这两天刚刚开发和测试完,其中遇到了一些问题,也有了不少的收获,现在做一个总结。
对于zk,百度百科上有详细的介绍,不知道的童鞋可以自行了解,这里我们只需要明白两点即可:

1:zk是可以单实例或者集群化部署的                                                                                                                                                

 2:如果zk以集群化部署,相应会产生多个zk节点,那么只要有超过一半(必须超过)的zk节点宕机,则整个zk集群都将无法正常工作。

对zk操作的pom.xml文件中maven添加的依赖地址如下

<!-- zk 连接客户端 start -->

<dependency>

<groupId>org.apache.curator</groupId>

<artifactId>curator-framework</artifactId>

<version>2.8.0</version>

</dependency>

<!-- zk 连接客户端 end -->

要想对zk的节点即zktree进行操作,第一步是与zk建立连接,代码如下:

 /**

* @描述:创建一个zookeeper连接

*/

private static void CreateZkclientConnection() {

// 定义zk服务器的ip和port,多个节点的话用","分隔

final String connectString = "197.3.153.159:2181,197.3.153.160:2181,197.3.153.161:2181";

// retryPolicy是连接zk过程中重连策略,两个参数分别代表:两次重连的等待时间和最大重试次数

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 100);

// 创建CuratorFramework实例,创建完成即代表连接zk成功

CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);

// 调用start方法打开连接

client.start();

}

与zk建立连接之后就可以对zk节点进行操作了,首先是创建节点,代码如下:

/**

* @描述:创建一个zookeeper节点

* @param path 路径

* @param json 节点名

* @throws Exception

*/

public void createNode(String path, String json) throws Exception {

final String connectString = "197.3.153.159:2181,197.3.153.160:2181,197.3.153.161:2181";
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 100);
CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
client.start();
try {
// 传入路径和节点名调用zkclient自身的create方法
client.create().creatingParentsIfNeeded().forPath(path, json.getBytes(GatewayConstant.UTF8));
} catch (Exception e) {
e.printStackTrace();
} finally {
// 对zk操作完成之后要注意关闭连接
if (client != null) {
    client.close();
}

}

}

这里对create()方法做个说明:create()---执行创建操作,可以调用额外的方法(比如后台执行background)并在最后调用forPath()指定要操作的znode。

接下来是查询某个路径下的节点,代码如下:

 /**

* @描述:查询zookeeper路径的节点

* @param path 要查询节点的路径

* @return attrJson 查询到的节点名

* @throws Exception

*/

public String queryNode(String path) throws Exception {

final String connectString = "197.3.153.159:2181,197.3.153.160:2181,197.3.153.161:2181";

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 100);

CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);

client.start();

// 定义查询到的节点

String attrJson = null;

try {

// 调用zkclient的getData()方法

byte[] byteNode = client.getData().forPath(path);

// 转成UTF-8格式的字符串

attrJson = new String(byteNode, GatewayConstant.UTF8);

} catch (Exception e) {

e.printStackTrace();

} finally {

// 对zk操作完成之后要注意关闭连接

if (client != null) {

    client.close();

}

}

return attrJson;

}

这里对getData()方法做个说明:getData()---执行获取znode节点数据的操作,可以调用额外的方法(比如监控、后台处理或者获取状态watch)并在最后调用forPath()指定要操作的znode。

然后是修改某个路径下的节点值,代码如下:

/**

* @描述:修改zookeeper路径的节点值

* @param path 要修改节点值的路径

* @param json 要修改成的内容

* @throws Exception

*/

public void editNode(String path, String json) throws Exception {

final String connectString = "197.3.153.159:2181,197.3.153.160:2181,197.3.153.161:2181";

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 100);

CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);

client.start();

try {

// 调用zkclient的setData()方法

client.setData().forPath(path, json.getBytes(GatewayConstant.UTF8));

} catch (Exception e) {

e.printStackTrace();

} finally {

// 对zk操作完成之后要注意关闭连接

if (client != null) {

    client.close();

}

}

}

这里对setData()方法做个说明:setData()---执行设置znode节点数据的操作,可以调用额外的方法(比如版本、后台处理)并在最后调用forPath()指定要操作的znode。
然后是删除某个路径的节点,代码如下:

/**

* @描述:删除zookeeper路径的节点

* @param path 要删除节点的路径

* @throws Exception

*/

public void deteleNode(String path) throws Exception {

final String connectString = "197.3.153.159:2181,197.3.153.160:2181,197.3.153.161:2181";

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 100);

CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);

client.start();

try {

// 调用zkclient的delete()方法

client.delete().forPath(path);

} catch (Exception e) {

e.printStackTrace();

} finally {