zookeeper curator客户端之增删改查

zookeeper安装:https://www.cnblogs.com/zwcry/p/10272506.html

curator客户端是Apache对zookeeper原生API的封装,在原生API的基础上又支持了每次的事件监听、重试机制、递归等操作。

客户端增删改查测试类:

package com.qy.learn.zk.curator;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* @author 七脉
* 描述:zookeeper教程相关代码,并非封装,而是测试学习加注释说明,教你使用。实际工作中按照公司开发的代码规范走
* apache 的Curator是封装后的客户端,本人不建议自己封装, 可以使用Curator再次封装。
*/
public class MyCuratorClient {
private static final Logger log = LoggerFactory.getLogger(MyCuratorClient.class); //集群节点
public static final String zkServerClusterConnect = "192.168.159.129:2181,192.168.159.129:2182,192.168.159.129:2183"; //单一节点
public static final String zkServerSingleConnect = "192.168.159.129:2181"; public static void main(String[] args) throws Exception { CuratorFramework client = client();
log.info("客户端状态:{}", client.getState()); client.start();
log.info("客户端状态:{}", client.getState()); //创建节点
//create(client, "/father/me", "me"); //查询节点
//query(client, "/father/me"); //修改节点的值
//update(client, "/father/me", "newMe"); //删除节点
//delete(client, "/father/me"); client.close();
log.info("客户端状态:{}", client.getState());
} /**
* @author 七脉
* 描述:获取CuratorFramework的客户端
* @return
*/
public static CuratorFramework client(){
log.info("准备创建CuratorFramework客户端");
int sessionTimeoutMs = 10000;//会话超时时间
int connectionTimeoutMs = 3000;//初次链接超时时间
int n = 3;//重试链接次数
int sleepMsBetweenRetries = 3000;//每次重试连接间隔毫秒数 //RetryPolicy重试显现策略有很多,具体可以查看RetryPolicy的每个实现类进行测试。
RetryPolicy retryPolicy = new RetryNTimes(n, sleepMsBetweenRetries); //CuratorFrameworkFactory.newClient是创建客户端的一种方法
//CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient(zkServerClusterConnect, sessionTimeoutMs, connectionTimeoutMs, retryPolicy); //创建客户端方法还有 CuratorFrameworkFactory.builder()....
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(zkServerClusterConnect).connectionTimeoutMs(connectionTimeoutMs).sessionTimeoutMs(sessionTimeoutMs).retryPolicy(retryPolicy).namespace("myspace").build();
log.info("完成创建CuratorFramework客户端");
return curatorFramework;
} /**
* @author 七脉
* 描述:递归创建节点数据
* @param client
* @param path
* @param data
* @throws Exception
*/
public static void create(CuratorFramework client, String path, String data) throws Exception{
log.info("准备递归创建节点,path:{},data:{}", path, data);
client.create().creatingParentsIfNeeded()//如果path父节点不存在,一并创建
.withMode(CreateMode.PERSISTENT)//永久节点
.withACL(Ids.OPEN_ACL_UNSAFE)//所有可见权限
.forPath(path, data.getBytes());//设置节点数据
log.info("完成递归创建节点,path:{},data:{}", path, data);
} /**
* @author 七脉
* 描述:查询节点值
* @param client
* @param path
* @return
* @throws Exception
*/
public static String query(CuratorFramework client, String path) throws Exception{
log.info("准备查询节点:{} 值",path);
String data = new String(client.getData().storingStatIn(getStat(client, path)).forPath(path));
log.info("完成查询节点:{}, 值:{}", path, data);
return data;
} /**
* @author 七脉
* 描述:修改节点的值
* @param client
* @param path
* @param data
* @return
* @throws Exception
*/
public static Stat update(CuratorFramework client, String path, String data) throws Exception{
log.info("准备修改节点:{},值:{}", path, data);
Stat stat = client.setData().withVersion(getStat(client, path).getVersion()).forPath(path, data.getBytes());
log.info("完成修改节点:{},值:{}", path, data);
return stat;
} /**
* @author 七脉
* 描述:淡出节点
* @param client
* @param path
* @throws Exception
*/
public static void delete(CuratorFramework client, String path) throws Exception{
log.info("准备删除节点:{}",path);
client.delete().guaranteed()//就算网络遇见抖动,只要连接成功,也会保证删除
.deletingChildrenIfNeeded()//递归删除子节点
.withVersion(getStat(client, path).getVersion()).forPath(path);
log.info("完成删除节点:{}",path);
} /**
* @author 七脉
* 描述:查询节点元数据,查询、修改、删除时需要该数据的信息作为参数
* 同样也是判断节点是否存在的方法
* @param client
* @param path
* @return
* @throws Exception
*/
public static Stat getStat(CuratorFramework client, String path) throws Exception{
log.info("准备获取 节点:{}的stat",path);
Stat stat = client.checkExists().forPath(path);
if(null==stat){
log.info("获取节点:{} 不存在或已删除",path);
}else{
log.info("完成获取节点:{} stat信息, version:{}",path,stat.getVersion());
}
return stat;
} /**
* @author 七脉
* 描述:测试客户端的三个状态
* client.isStarted();//官方已经建议使用该方法,后续升级可能不会对其维护,请不要再使用。
*/
public static void status(){
CuratorFramework client = client();
//client.isStarted();//官方已经建议使用该方法,后续升级可能不会对其维护,请不要再使用。
log.info("客户端状态:{}", client.getState());
client.start();
log.info("客户端状态:{}", client.getState());
client.close();
log.info("客户端状态:{}", client.getState());
} }

pom配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent> <groupId>com.qy.learn</groupId>
<artifactId>qy-learn-zk-curator</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
<maven.test.skip>true</maven.test.skip>
<java.version>1.8</java.version>
<spring.boot.version>2.0.1.RELEASE</spring.boot.version>
<qy.code.version>0.0.1-SNAPSHOT</qy.code.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 不使用springboot默认log -->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.12</version>
<!-- 排除冲突jar -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.1.0</version>
</dependency> </dependencies> <repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories> <build>
<plugins>
<!-- 要将源码放上去,需要加入这个插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<configuration>
<attach>true</attach>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project> 

源码:https://pan.baidu.com/s/1WxW0NU6p7oAiK9O3Vtq-Hg

zookeeper curator客户端之增删改查的更多相关文章

  1. java springboot整合zookeeper入门教程(增删改查)

    java springboot整合zookeeper增删改查入门教程 zookeeper的安装与集群搭建参考:https://www.cnblogs.com/zwcry/p/10272506.html ...

  2. zookeeper 数据节点的增删改查

    1.连接服务端 [root@localhost bin]# ./zkCli.sh -server 127.0.0.1:2181 Connecting to 127.0.0.1:2181 2018-05 ...

  3. Zookeeper 客户端API调用示例(基本使用,增删改查znode数据,监听znode,其它案例,其它网络参考资料)

    9.1 基本使用 org.apache.zookeeper.Zookeeper是客户端入口主类,负责建立与server的会话 它提供以下几类主要方法  : 功能 描述 create 在本地目录树中创建 ...

  4. ZooKeeper客户端 zkCli.sh 节点的增删改查

    zkCli.sh 在 bin 目录下的  zkCli.sh  就是ZooKeeper客户端 ./zkCli.sh -timeout 5000  -server 127.0.0.1:2181  客户端与 ...

  5. Zookeeper增删改查

    1.下载Zookeeper http://mirrors.shu.edu.cn/apache/zookeeper/ 这里我选择Zookeeper 3.4.11版本 ZooKeeper 支持某些特定的四 ...

  6. Zookeeper入门(六)之zkCli.sh对节点的增删改查

    参考地址为:https://www.cnblogs.com/sherrykid/p/5813148.html 1.连接 在 bin 目录下的  zkCli.sh  就是ZooKeeper客户端 ./z ...

  7. python 全栈开发,Day124(MongoDB初识,增删改查操作,数据类型,$关键字以及$修改器,"$"的奇妙用法,Array Object 的特殊操作,选取跳过排序,客户端操作)

    一.MongoDB初识 什么是MongoDB MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介 ...

  8. ZooKeeper学习之路 (五)ZooKeeper API的简单使用 增删改查

    zookeeper文件系统的增删改查 public class ZKDemo1 { private static final String CONNECT_STRING = "hadoop1 ...

  9. Zookeeper demo增删改查

    Zookeeper 的增删改查demo代码 public class SimpleZkClient { private static final String connectString = &quo ...

随机推荐

  1. SqlSession接口和Executor

    mybatis框架在操作数据的时候,离不开SqlSession接口实例类的作用.可以说SqlSession接口实例是开发过程中打交道最多的一个类.即是DefaultSqlSession类.如果笔者记得 ...

  2. 在 Ubuntu Mate 16.04 上通过 PPA 升级 Mate 1.14

    导读 Mate 桌面环境 1.14 现在可以在 Ubuntu Mate 16.04 ("Xenial Xerus") 上使用了.根据这个版本的描述,为了全面测试 Mate 1.14 ...

  3. Delphi XE5通过WebService开发Web服务端和手机客户端

    Delphi XE5通过WebService开发Web服务端和手机客户端介绍 我们开发一个三层的android程序 建立一个webservices  stand-alone vcl applicati ...

  4. python反序列化研究学习

    零.补充: 补充于2018-02-08,之前研究时候有一个疑惑,python的序列化成二进制,打web服务怎么传这个二进制对象呢,今天请教了身边大神(传说的九零后黑客代表),可以使用base64传输. ...

  5. 【BZOJ1706】[usaco2007 Nov]relays 奶牛接力跑 矩阵乘法

    [BZOJ1706][usaco2007 Nov]relays 奶牛接力跑 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们的日常锻炼项 ...

  6. angular 2+ innerHTML属性中内联样式丢失

    通过属性绑定的innerHTML,把字符串里面的html解析 解析是没问题的,但一些内联样式会丢失掉 为了不丢掉样式,需要自定义一个管道来解决这个问题 html.pipe.ts import {Pip ...

  7. 160419、CSS3实现32种基本图形

    CSS3可以实现很多漂亮的图形,我收集了32种图形,在下面列出.直接用CSS3画出这些图形,要比贴图性能更好,体验更加,是一种非常好的网页美观方式. 这32种图形分别为圆形,椭圆形,三角形,倒三角形, ...

  8. fiddler弱网测试

    模拟低速网路环境…启用方法如下: Rules → Performances → Simulate Modem Speeds (如下图)· 勾选之后,你会发现你的网路瞬间慢超多… (想当年国中时我们的网 ...

  9. Apache Kafka Replication Design – High level

    参考,https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Replication Kafka Replication High-level ...

  10. 算法大神之路——排序

    从今天开始,给自己立下一个目标,每天晚上写一篇算法与数据结构的博客,用来给自己以后的算法工程师的目标铺路! 今天晚上就以算法里面的排序,作为自己的第一章节吧. 排序,就是讲一组数据,按照特定的规则去调 ...