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 {