博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

Zookeeper 从安装到应用_zookeeper


文章目录

  • 1、什么是 Zookeeper
  • 2、Zookeeper 的安装教程
  • 3、Zookeeper 的应用场景
  • 4、Zookeeper 实现了 CAP 理论
  • 5、Zookeeper 实现配置管理功能
  • 6、Zookeeper 实现简单的分布式锁


1、什么是 Zookeeper

Zookeeper 是一个开源的分布式协调服务,它提供了分布式系统中的一致性、可靠性、容错性等服务。Zookeeper 可以用于分布式应用程序中的配置管理、命名服务、分布式锁、分布式队列等场景。

2、Zookeeper 的安装教程

Zookeeper 官网 https://zookeeper.apache.org/releases.html#news,点击页面上方的“Download”按钮,进入下载页面。

或者linux 在下载,使用命令行下载Zookeeper压缩包,命令如下:

wget https://downloads.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz

下载日志

[root@ecs-32f7 software]# wget https://downloads.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
--2023-06-26 17:20:35--  https://downloads.apache.org/zookeeper/zookeeper-3.7.1/apache-zookeeper-3.7.1-bin.tar.gz
Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104, 2a01:4f9:3a:2c57::2, ...
Connecting to downloads.apache.org (downloads.apache.org)|88.99.95.219|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 12649765 (12M) [application/x-gzip]
Saving to: ‘apache-zookeeper-3.7.1-bin.tar.gz’

100%[===================================================================================================================================>] 12,649,765  2.00MB/s   in 6.0s

2023-06-26 17:20:44 (2.00 MB/s) - ‘apache-zookeeper-3.7.1-bin.tar.gz’ saved [12649765/12649765]

[root@ecs-32f7 software]#

然后解压

tar -zxvf /root/software/apache-zookeeper-3.7.1-bin.tar.gz

进入根目录

cd apache-zookeeper-3.7.1-bin/

修改配置文件

mv conf/zoo_sample.cfg conf/zoo.cfg
vim conf/zoo.cfg

修改日志存储位置

dataDir=/root/software/apache-zookeeper-3.7.1-bin/logs
clientPort=2181
admin.serverPort=16000

启动命令

bin/zkServer.sh start

启动标识

ZooKeeper JMX enabled by default
Using config: /root/software/apache-zookeeper-3.7.1-bin/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@ecs-32f7 apache-zookeeper-3.7.1-bin]#

如果装了 java 的,也可以通过 jps 查看是否启动

[root@ecs-32f7 apache-zookeeper-3.7.1-bin]# jps
17266 QuorumPeerMain

3、Zookeeper 的应用场景

Zookeeper 的应用场景非常广泛,以下是一些常见的应用场景:

  1. 配置管理:Zookeeper 可以用于管理分布式系统中的配置信息,例如 Hadoop 集群的配置信息。
  2. 命名服务:Zookeeper 可以用于实现分布式系统中的命名服务,例如 Hadoop 集群中的 NameNode。
  3. 分布式锁:Zookeeper 可以用于实现分布式锁,保证分布式系统中的数据一致性。
  4. 分布式队列:Zookeeper 可以用于实现分布式队列,例如 Kafka 中的消费者组协调。
  5. 集群管理:Zookeeper 可以用于实现集群管理,例如 Hadoop 集群中的ResourceManager。

总之,Zookeeper 可以用于任何需要分布式协调的场景,它提供了一种简单而强大的方式来管理分布式系统中的状态信息。

4、Zookeeper 实现了 CAP 理论

Zookeeper 实现了 CAP 理论中的 CP 模型,即一致性和分区容错性。在分布式系统中,由于网络分区等原因,可能会出现节点之间的通信故障,这时候需要保证系统的一致性。Zookeeper 通过使用 Paxos 算法来保证分布式系统中的一致性,同时通过多数派原则来保证分区容错性。因此,Zookeeper 可以保证系统的一致性和分区容错性,而牺牲了可用性。

5、Zookeeper 实现配置管理功能

pom.xml 先引入

<!-- zookeeper -->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.6.2</version>
</dependency>

下面是利用 zookeeper 的节点存储配置信息:

package com.pany.camp.zookeeper;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;

/**
 * @description: Zookeeper 配置管理功能
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-26 20:12
 */
public class ConfigManager {
    private ZooKeeper zooKeeper;

    public ConfigManager() throws IOException, KeeperException, InterruptedException {
        zooKeeper = new ZooKeeper("localhost:2181", 5000, null);
        init();
    }

    private void init() throws KeeperException, InterruptedException {
        String path = "/config";
        String data = "hello world";
        Stat stat = zooKeeper.exists(path, false);
        if (stat == null) {
            zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }
    }

    public String getConfig() throws KeeperException, InterruptedException {
        String path = "/config";
        byte[] data = zooKeeper.getData(path, false, null);
        return new String(data);
    }

    public void updateConfig(String config) throws KeeperException, InterruptedException {
        String path = "/config";
        zooKeeper.setData(path, config.getBytes(), -1);
    }

    public void deleteConfig() throws KeeperException, InterruptedException {
        String path = "/config";
        zooKeeper.delete(path, -1);
    }

    public void close() throws InterruptedException {
        zooKeeper.close();
    }

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        ConfigManager configManager = new ConfigManager();

        String config = configManager.getConfig();
        System.out.println("Config: " + config);

        configManager.updateConfig("hello zookeeper");
        config = configManager.getConfig();
        System.out.println("Config: " + config);

        configManager.deleteConfig();
        config = configManager.getConfig();
        System.out.println("Config: " + config);

        configManager.close();
    }
}

输出如下,因为 /config 最后被删除了,所以 getConfig() 便抛出异常。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/software/apache-maven-3.2.3/.m2/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/D:/software/apache-maven-3.2.3/.m2/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
20:27:05.831 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.6.2--803c7f1a12f85978cb049af5e4ef23bd8b688715, built on 09/04/2020 12:44 GMT
20:27:05.836 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=pany
20:27:05.839 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.8.0_201
20:27:05.839 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation
20:27:05.839 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=D:\software\jdk\jre
20:27:05.839 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=D:\software\jdk\jre\lib\charsets.jar;D:\software\jdk\jre\lib\deploy.jar;D:\software\jdk\jre\lib\ext\access-bridge-64.jar;D:\software\jdk\jre\lib\ext\cldrdata.jar;D:\software\jdk\jre\lib\ext\dnsns.jar;D:\software\jdk\jre\lib\ext\jaccess.jar;D:\software\jdk\jre\lib\ext\jfxrt.jar;D:\software\jdk\jre\lib\ext\localedata.jar;D:\software\jdk\jre\lib\ext\nashorn.jar;D:\software\jdk\jre\lib\ext\sunec.jar;D:\software\jdk\jre\lib\ext\sunjce_provider.jar;D:\software\jdk\jre\lib\ext\sunmscapi.jar;D:\software\jdk\jre\lib\ext\sunpkcs11.jar;D:\software\jdk\jre\lib\ext\zipfs.jar;D:\software\jdk\jre\lib\javaws.jar;D:\software\jdk\jre\lib\jce.jar;D:\software\jdk\jre\lib\jfr.jar;D:\software\jdk\jre\lib\jfxswt.jar;D:\software\jdk\jre\lib\jsse.jar;D:\software\jdk\jre\lib\management-agent.jar;D:\software\jdk\jre\lib\plugin.jar;D:\software\jdk\jre\lib\resources.jar;D:\software\jdk\jre\lib\rt.jar;D:\software\idea\codeSpace\sourceCode\java-study\target\classes;D:\software\idea\codeSpace\sourceCode\java-study\src\main\resources\libs\lz4-1.3.0.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-actuator\2.1.2.RELEASE\spring-boot-starter-actuator-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-actuator-autoconfigure\2.1.2.RELEASE\spring-boot-actuator-autoconfigure-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-actuator\2.1.2.RELEASE\spring-boot-actuator-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\com\fasterxml\jackson\core\jackson-databind\2.9.8\jackson-databind-2.9.8.jar;D:\software\apache-maven-3.2.3\.m2\com\fasterxml\jackson\core\jackson-core\2.9.8\jackson-core-2.9.8.jar;D:\software\apache-maven-3.2.3\.m2\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.9.8\jackson-datatype-jsr310-2.9.8.jar;D:\software\apache-maven-3.2.3\.m2\io\micrometer\micrometer-core\1.1.2\micrometer-core-1.1.2.jar;D:\software\apache-maven-3.2.3\.m2\org\hdrhistogram\HdrHistogram\2.1.9\HdrHistogram-2.1.9.jar;D:\software\apache-maven-3.2.3\.m2\org\latencyutils\LatencyUtils\2.0.3\LatencyUtils-2.0.3.jar;D:\software\apache-maven-3.2.3\.m2\net\bytebuddy\byte-buddy\1.9.7\byte-buddy-1.9.7.jar;D:\software\apache-maven-3.2.3\.m2\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-core\5.1.4.RELEASE\spring-core-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-jcl\5.1.4.RELEASE\spring-jcl-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter\2.1.2.RELEASE\spring-boot-starter-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot\2.1.2.RELEASE\spring-boot-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-logging\2.1.2.RELEASE\spring-boot-starter-logging-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\software\apache-maven-3.2.3\.m2\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\logging\log4j\log4j-to-slf4j\2.11.1\log4j-to-slf4j-2.11.1.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\logging\log4j\log4j-api\2.11.1\log4j-api-2.11.1.jar;D:\software\apache-maven-3.2.3\.m2\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;D:\software\apache-maven-3.2.3\.m2\javax\annotation\javax.annotation-api\1.3.2\javax.annotation-api-1.3.2.jar;D:\software\apache-maven-3.2.3\.m2\org\yaml\snakeyaml\1.23\snakeyaml-1.23.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-autoconfigure\2.1.2.RELEASE\spring-boot-autoconfigure-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-jdbc\2.1.2.RELEASE\spring-boot-starter-jdbc-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\com\zaxxer\HikariCP\3.2.0\HikariCP-3.2.0.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-jdbc\5.1.4.RELEASE\spring-jdbc-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-beans\5.1.4.RELEASE\spring-beans-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-configuration-processor\2.1.2.RELEASE\spring-boot-configuration-processor-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-web\2.1.2.RELEASE\spring-boot-starter-web-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-json\2.1.2.RELEASE\spring-boot-starter-json-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\com\fasterxml\jackson\datatype\jackson-datatype-jdk8\2.9.8\jackson-datatype-jdk8-2.9.8.jar;D:\software\apache-maven-3.2.3\.m2\com\fasterxml\jackson\module\jackson-module-parameter-names\2.9.8\jackson-module-parameter-names-2.9.8.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-tomcat\2.1.2.RELEASE\spring-boot-starter-tomcat-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\tomcat\embed\tomcat-embed-core\9.0.14\tomcat-embed-core-9.0.14.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\tomcat\embed\tomcat-embed-el\9.0.14\tomcat-embed-el-9.0.14.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\tomcat\embed\tomcat-embed-websocket\9.0.14\tomcat-embed-websocket-9.0.14.jar;D:\software\apache-maven-3.2.3\.m2\org\hibernate\validator\hibernate-validator\6.0.14.Final\hibernate-validator-6.0.14.Final.jar;D:\software\apache-maven-3.2.3\.m2\javax\validation\validation-api\2.0.1.Final\validation-api-2.0.1.Final.jar;D:\software\apache-maven-3.2.3\.m2\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-web\5.1.4.RELEASE\spring-web-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-webmvc\5.1.4.RELEASE\spring-webmvc-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-expression\5.1.4.RELEASE\spring-expression-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\mybatis\spring\boot\mybatis-spring-boot-starter\1.1.1\mybatis-spring-boot-starter-1.1.1.jar;D:\software\apache-maven-3.2.3\.m2\org\mybatis\spring\boot\mybatis-spring-boot-autoconfigure\1.1.1\mybatis-spring-boot-autoconfigure-1.1.1.jar;D:\software\apache-maven-3.2.3\.m2\org\mybatis\mybatis\3.4.0\mybatis-3.4.0.jar;D:\software\apache-maven-3.2.3\.m2\org\mybatis\mybatis-spring\1.3.0\mybatis-spring-1.3.0.jar;D:\software\apache-maven-3.2.3\.m2\junit\junit\4.12\junit-4.12.jar;D:\software\apache-maven-3.2.3\.m2\io\springfox\springfox-swagger2\2.9.2\springfox-swagger2-2.9.2.jar;D:\software\apache-maven-3.2.3\.m2\io\swagger\swagger-annotations\1.5.20\swagger-annotations-1.5.20.jar;D:\software\apache-maven-3.2.3\.m2\io\swagger\swagger-models\1.5.20\swagger-models-1.5.20.jar;D:\software\apache-maven-3.2.3\.m2\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;D:\software\apache-maven-3.2.3\.m2\io\springfox\springfox-spi\2.9.2\springfox-spi-2.9.2.jar;D:\software\apache-maven-3.2.3\.m2\io\springfox\springfox-core\2.9.2\springfox-core-2.9.2.jar;D:\software\apache-maven-3.2.3\.m2\io\springfox\springfox-schema\2.9.2\springfox-schema-2.9.2.jar;D:\software\apache-maven-3.2.3\.m2\io\springfox\springfox-swagger-common\2.9.2\springfox-swagger-common-2.9.2.jar;D:\software\apache-maven-3.2.3\.m2\io\springfox\springfox-spring-web\2.9.2\springfox-spring-web-2.9.2.jar;D:\software\apache-maven-3.2.3\.m2\com\fasterxml\classmate\1.4.0\classmate-1.4.0.jar;D:\software\apache-maven-3.2.3\.m2\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\plugin\spring-plugin-core\1.2.0.RELEASE\spring-plugin-core-1.2.0.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\plugin\spring-plugin-metadata\1.2.0.RELEASE\spring-plugin-metadata-1.2.0.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\mapstruct\mapstruct\1.2.0.Final\mapstruct-1.2.0.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\springfox\springfox-swagger-ui\2.9.2\springfox-swagger-ui-2.9.2.jar;D:\software\apache-maven-3.2.3\.m2\com\alibaba\fastjson\1.2.31\fastjson-1.2.31.jar;D:\software\apache-maven-3.2.3\.m2\com\github\ulisesbocchio\jasypt-spring-boot-starter\2.1.1\jasypt-spring-boot-starter-2.1.1.jar;D:\software\apache-maven-3.2.3\.m2\com\github\ulisesbocchio\jasypt-spring-boot\2.1.1\jasypt-spring-boot-2.1.1.jar;D:\software\apache-maven-3.2.3\.m2\com\melloware\jasypt\1.9.4\jasypt-1.9.4.jar;D:\software\apache-maven-3.2.3\.m2\com\alibaba\druid\1.0.29\druid-1.0.29.jar;D:\software\jdk\lib\jconsole.jar;D:\software\jdk\lib\tools.jar;D:\software\apache-maven-3.2.3\.m2\mysql\mysql-connector-java\8.0.13\mysql-connector-java-8.0.13.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-thymeleaf\2.1.2.RELEASE\spring-boot-starter-thymeleaf-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\thymeleaf\thymeleaf-spring5\3.0.11.RELEASE\thymeleaf-spring5-3.0.11.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\thymeleaf\thymeleaf\3.0.11.RELEASE\thymeleaf-3.0.11.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\attoparser\attoparser\2.0.5.RELEASE\attoparser-2.0.5.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\unbescape\unbescape\1.1.6.RELEASE\unbescape-1.1.6.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\thymeleaf\extras\thymeleaf-extras-java8time\3.0.2.RELEASE\thymeleaf-extras-java8time-3.0.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\httpcomponents\httpclient\4.5.9\httpclient-4.5.9.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\httpcomponents\httpcore\4.4.10\httpcore-4.4.10.jar;D:\software\apache-maven-3.2.3\.m2\commons-codec\commons-codec\1.11\commons-codec-1.11.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-core\1.8.0\shiro-core-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-lang\1.8.0\shiro-lang-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-cache\1.8.0\shiro-cache-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-crypto-hash\1.8.0\shiro-crypto-hash-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-crypto-core\1.8.0\shiro-crypto-core-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-crypto-cipher\1.8.0\shiro-crypto-cipher-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-config-core\1.8.0\shiro-config-core-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-config-ogdl\1.8.0\shiro-config-ogdl-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\commons-beanutils\commons-beanutils\1.9.4\commons-beanutils-1.9.4.jar;D:\software\apache-maven-3.2.3\.m2\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-event\1.8.0\shiro-event-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-spring\1.8.0\shiro-spring-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\shiro\shiro-web\1.8.0\shiro-web-1.8.0.jar;D:\software\apache-maven-3.2.3\.m2\org\owasp\encoder\encoder\1.2.2\encoder-1.2.2.jar;D:\software\apache-maven-3.2.3\.m2\com\github\penggle\kaptcha\2.3.2\kaptcha-2.3.2.jar;D:\software\apache-maven-3.2.3\.m2\javax\servlet\javax.servlet-api\4.0.1\javax.servlet-api-4.0.1.jar;D:\software\apache-maven-3.2.3\.m2\com\jhlabs\filters\2.0.235-1\filters-2.0.235-1.jar;D:\software\apache-maven-3.2.3\.m2\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\software\apache-maven-3.2.3\.m2\com\github\pagehelper\pagehelper-spring-boot-starter\1.2.5\pagehelper-spring-boot-starter-1.2.5.jar;D:\software\apache-maven-3.2.3\.m2\com\github\pagehelper\pagehelper-spring-boot-autoconfigure\1.2.5\pagehelper-spring-boot-autoconfigure-1.2.5.jar;D:\software\apache-maven-3.2.3\.m2\com\github\pagehelper\pagehelper\5.1.10\pagehelper-5.1.10.jar;D:\software\apache-maven-3.2.3\.m2\com\github\jsqlparser\jsqlparser\2.0\jsqlparser-2.0.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-mail\2.1.2.RELEASE\spring-boot-starter-mail-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-context-support\5.1.4.RELEASE\spring-context-support-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\com\sun\mail\javax.mail\1.6.2\javax.mail-1.6.2.jar;D:\software\apache-maven-3.2.3\.m2\javax\activation\activation\1.1\activation-1.1.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-aop\2.1.2.RELEASE\spring-boot-starter-aop-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-aop\5.1.4.RELEASE\spring-aop-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\aspectj\aspectjweaver\1.9.2\aspectjweaver-1.9.2.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-all\4.1.77.Final\netty-all-4.1.77.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-buffer\4.1.31.Final\netty-buffer-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec\4.1.31.Final\netty-codec-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-dns\4.1.31.Final\netty-codec-dns-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-haproxy\4.1.31.Final\netty-codec-haproxy-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-http\4.1.31.Final\netty-codec-http-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-http2\4.1.31.Final\netty-codec-http2-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-memcache\4.1.31.Final\netty-codec-memcache-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-mqtt\4.1.31.Final\netty-codec-mqtt-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-redis\4.1.31.Final\netty-codec-redis-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-smtp\4.1.31.Final\netty-codec-smtp-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-socks\4.1.31.Final\netty-codec-socks-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-stomp\4.1.31.Final\netty-codec-stomp-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-codec-xml\4.1.31.Final\netty-codec-xml-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-common\4.1.31.Final\netty-common-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-handler\4.1.31.Final\netty-handler-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-handler-proxy\4.1.31.Final\netty-handler-proxy-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-resolver\4.1.31.Final\netty-resolver-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-resolver-dns\4.1.31.Final\netty-resolver-dns-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport\4.1.31.Final\netty-transport-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-rxtx\4.1.31.Final\netty-transport-rxtx-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-sctp\4.1.31.Final\netty-transport-sctp-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-udt\4.1.31.Final\netty-transport-udt-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-classes-epoll\4.1.77.Final\netty-transport-classes-epoll-4.1.77.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-native-unix-common\4.1.31.Final\netty-transport-native-unix-common-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-classes-kqueue\4.1.77.Final\netty-transport-classes-kqueue-4.1.77.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-resolver-dns-classes-macos\4.1.77.Final\netty-resolver-dns-classes-macos-4.1.77.Final.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-native-epoll\4.1.31.Final\netty-transport-native-epoll-4.1.31.Final-linux-x86_64.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-native-epoll\4.1.77.Final\netty-transport-native-epoll-4.1.77.Final-linux-aarch_64.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-native-kqueue\4.1.31.Final\netty-transport-native-kqueue-4.1.31.Final-osx-x86_64.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-native-kqueue\4.1.77.Final\netty-transport-native-kqueue-4.1.77.Final-osx-aarch_64.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-resolver-dns-native-macos\4.1.77.Final\netty-resolver-dns-native-macos-4.1.77.Final-osx-x86_64.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-resolver-dns-native-macos\4.1.77.Final\netty-resolver-dns-native-macos-4.1.77.Final-osx-aarch_64.jar;D:\software\apache-maven-3.2.3\.m2\com\google\code\gson\gson\2.9.0\gson-2.9.0.jar;D:\software\apache-maven-3.2.3\.m2\com\google\guava\guava\21.0\guava-21.0.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-devtools\2.1.2.RELEASE\spring-boot-devtools-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\commons\commons-compress\1.21\commons-compress-1.21.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\zookeeper\zookeeper\3.6.2\zookeeper-3.6.2.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\zookeeper\zookeeper-jute\3.6.2\zookeeper-jute-3.6.2.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;D:\software\apache-maven-3.2.3\.m2\io\netty\netty-transport-native-epoll\4.1.31.Final\netty-transport-native-epoll-4.1.31.Final.jar;D:\software\apache-maven-3.2.3\.m2\org\slf4j\slf4j-log4j12\1.7.25\slf4j-log4j12-1.7.25.jar;D:\software\apache-maven-3.2.3\.m2\log4j\log4j\1.2.17\log4j-1.2.17.jar;D:\software\apache-maven-3.2.3\.m2\org\openjdk\jol\jol-core\0.16\jol-core-0.16.jar;D:\software\apache-maven-3.2.3\.m2\com\carrotsearch\java-sizeof\0.0.3\java-sizeof-0.0.3.jar;D:\software\apache-maven-3.2.3\.m2\cn\hutool\hutool-all\5.8.11\hutool-all-5.8.11.jar;D:\software\apache-maven-3.2.3\.m2\com\hankcs\hanlp\portable-1.8.1\hanlp-portable-1.8.1.jar;D:\software\apache-maven-3.2.3\.m2\org\jsoup\jsoup\1.13.1\jsoup-1.13.1.jar;D:\software\apache-maven-3.2.3\.m2\redis\clients\jedis\3.7.0\jedis-3.7.0.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\commons\commons-pool2\2.6.0\commons-pool2-2.6.0.jar;D:\software\apache-maven-3.2.3\.m2\org\bouncycastle\bcprov-jdk15on\1.68\bcprov-jdk15on-1.68.jar;D:\software\apache-maven-3.2.3\.m2\org\bouncycastle\bcpkix-jdk15on\1.68\bcpkix-jdk15on-1.68.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\boot\spring-boot-starter-data-redis\2.1.2.RELEASE\spring-boot-starter-data-redis-2.1.2.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\data\spring-data-redis\2.1.4.RELEASE\spring-data-redis-2.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\data\spring-data-keyvalue\2.1.4.RELEASE\spring-data-keyvalue-2.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\data\spring-data-commons\2.1.4.RELEASE\spring-data-commons-2.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-oxm\5.1.4.RELEASE\spring-oxm-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\io\lettuce\lettuce-core\5.1.3.RELEASE\lettuce-core-5.1.3.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\io\projectreactor\reactor-core\3.2.5.RELEASE\reactor-core-3.2.5.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\reactivestreams\reactive-streams\1.0.2\reactive-streams-1.0.2.jar;D:\software\apache-maven-3.2.3\.m2\org\apache\kafka\kafka-clients\2.8.0\kafka-clients-2.8.0.jar;D:\software\apache-maven-3.2.3\.m2\com\github\luben\zstd-jni\1.4.9-1\zstd-jni-1.4.9-1.jar;D:\software\apache-maven-3.2.3\.m2\org\lz4\lz4-java\1.7.1\lz4-java-1.7.1.jar;D:\software\apache-maven-3.2.3\.m2\org\xerial\snappy\snappy-java\1.1.8.1\snappy-java-1.1.8.1.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\kafka\spring-kafka\2.7.2\spring-kafka-2.7.2.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-context\5.1.4.RELEASE\spring-context-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-messaging\5.1.4.RELEASE\spring-messaging-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\spring-tx\5.1.4.RELEASE\spring-tx-5.1.4.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\springframework\retry\spring-retry\1.2.3.RELEASE\spring-retry-1.2.3.RELEASE.jar;D:\software\apache-maven-3.2.3\.m2\org\jetbrains\kotlin\kotlin-stdlib\1.2.71\kotlin-stdlib-1.2.71.jar;D:\software\apache-maven-3.2.3\.m2\org\jetbrains\kotlin\kotlin-stdlib-common\1.2.71\kotlin-stdlib-common-1.2.71.jar;D:\software\apache-maven-3.2.3\.m2\org\jetbrains\annotations\13.0\annotations-13.0.jar;D:\software\apache-maven-3.2.3\.m2\com\google\code\findbugs\jsr305\3.0.2\jsr305-3.0.2.jar;D:\software\idea\IntelliJ IDEA 2021.3.3\lib\idea_rt.jar
20:27:05.839 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.library.path=D:\software\jdk\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;C:\Python310\Scripts\;C:\Python310\;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;C:\windows\System32\OpenSSH\;D:\software\jdk\bin;D:\software\jdk\jre\bin;D:\software\scala\scala-2.12.8\bin;D:\software\gradle\gradle-5.4.1\bin;D:\software\xshell\;D:\software\xftp\;C:\Program Files\Git\cmd;C:\ProgramData\chocolatey\bin;D:\software\nodejs\node14\node_global;D:\software\nodejs\node14;D:\software\nodejs\node-v16.15.1-win-x64\node_global\node_modules\yarn;D:\software\apache-maven-3.5.4\bin;D:\software\nodejs\node14\;;D:\software\微信开发\微信web开发者工具\dll;D:\software\GoLang\bin;c:\Program Files (x86)\Microsoft SQL Server\90\Tools\binn\;C:\Users\py_wo\AppData\Local\Microsoft\WindowsApps;C:\Users\py_wo\AppData\Roaming\npm;C:\Users\py_wo\go\bin;D:\software\vscode\Microsoft VS Code\bin;.
20:27:05.839 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.io.tmpdir=C:\Users\py_wo\AppData\Local\Temp\
20:27:05.839 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.compiler=<NA>
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.name=Windows 10
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.arch=amd64
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.version=10.0
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.name=py_wo
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.home=C:\Users\py_wo
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:user.dir=D:\software\idea\codeSpace\sourceCode\java-study
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.free=219MB
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.max=3486MB
20:27:05.840 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:os.memory.total=236MB
20:27:05.847 [main] INFO org.apache.zookeeper.ZooKeeper - Initiating client connection, connectString=localhost:2181 sessionTimeout=5000 watcher=com.pany.camp.zookeeper.ConfigManager$1@1c53fd30
20:27:05.857 [main] INFO org.apache.zookeeper.common.X509Util - Setting -D jdk.tls.rejectClientInitiatedRenegotiation=true to disable client-initiated TLS renegotiation
20:27:06.295 [main] INFO org.apache.zookeeper.ClientCnxnSocket - jute.maxbuffer value is 1048575 Bytes
20:27:06.309 [main] INFO org.apache.zookeeper.ClientCnxn - zookeeper.request.timeout value is 0. feature enabled=false
20:27:06.315 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.SaslServerPrincipal - Canonicalized address to localhost
20:27:06.317 [main-SendThread(localhost:2181)] INFO org.apache.zookeeper.ClientCnxn - Opening socket connection to server localhost/127.0.0.1:2181.
20:27:06.317 [main-SendThread(localhost:2181)] INFO org.apache.zookeeper.ClientCnxn - SASL config status: Will not attempt to authenticate using SASL (unknown error)
20:27:06.319 [main-SendThread(localhost:2181)] INFO org.apache.zookeeper.ClientCnxn - Socket connection established, initiating session, client: /127.0.0.1:64707, server: localhost/127.0.0.1:2181
20:27:06.320 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Session establishment request sent on localhost/127.0.0.1:2181
20:27:06.332 [main-SendThread(localhost:2181)] INFO org.apache.zookeeper.ClientCnxn - Session establishment complete on server localhost/127.0.0.1:2181, session id = 0x1004edd1a400001, negotiated timeout = 5000
20:27:06.340 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 1,3  replyHeader:: 1,11,-101  request:: '/config,F  response::  
20:27:06.354 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 2,1  replyHeader:: 2,12,0  request:: '/config,#68656c6c6f20776f726c64,v{s{31,s{'world,'anyone}}},0  response:: '/config 
20:27:06.359 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 3,3  replyHeader:: 3,12,0  request:: '/config,F  response:: s{12,12,1687782426351,1687782426351,0,0,0,0,11,0,12} 
20:27:06.362 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 4,4  replyHeader:: 4,12,0  request:: '/config,F  response:: #68656c6c6f20776f726c64,s{12,12,1687782426351,1687782426351,0,0,0,0,11,0,12} 
Config: hello world
20:27:06.454 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 5,5  replyHeader:: 5,13,0  request:: '/config,#68656c6c6f207a6f6f6b6565706572,-1  response:: s{12,13,1687782426351,1687782426449,1,0,0,0,15,0,12} 
20:27:06.456 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 6,3  replyHeader:: 6,13,0  request:: '/config,F  response:: s{12,13,1687782426351,1687782426449,1,0,0,0,15,0,12} 
20:27:06.459 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 7,4  replyHeader:: 7,13,0  request:: '/config,F  response:: #68656c6c6f207a6f6f6b6565706572,s{12,13,1687782426351,1687782426449,1,0,0,0,15,0,12} 
Config: hello zookeeper
20:27:06.475 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 8,2  replyHeader:: 8,14,0  request:: '/config,-1  response:: null
20:27:06.477 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 9,3  replyHeader:: 9,14,-101  request:: '/config,F  response::  
20:27:06.478 [main-SendThread(localhost:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply session id: 0x1004edd1a400001, packet:: clientPath:null serverPath:null finished:false header:: 10,4  replyHeader:: 10,14,-101  request:: '/config,F  response::  
Exception in thread "main" org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /config
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:118)
	at org.apache.zookeeper.KeeperException.create(KeeperException.java:54)
	at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:2358)
	at org.apache.zookeeper.ZooKeeper.getData(ZooKeeper.java:2385)
	at com.pany.camp.zookeeper.ConfigManager.getConfig(ConfigManager.java:41)
	at com.pany.camp.zookeeper.ConfigManager.main(ConfigManager.java:67)

Process finished with exit code 1

6、Zookeeper 实现简单的分布式锁

代码如下:

package com.pany.camp.zookeeper;

import com.pany.camp.redis.SeckillDemo;
import org.apache.commons.lang.StringUtils;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import redis.clients.jedis.Jedis;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;

/**
 * @description: 分布式锁的简单实现
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-26 20:32
 */
public class DistributedLock {
    private ZooKeeper zk;
    private String lockPath;
    private String lockPrefix = "lock";
    private String lockName;

    public DistributedLock(String connectString, int sessionTimeout, String lockPath) throws Exception {
        this.zk = new ZooKeeper(connectString, sessionTimeout, null);
        this.lockPath = lockPath;
    }

    public void lock() throws KeeperException, InterruptedException {
        // 创建临时有序节点
        lockName = zk.create(lockPath + "/" + lockPrefix, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

        // 获取 lockPath 下的所有节点
        List<String> lockNodes = zk.getChildren(lockPath, false);

        // 对所有节点进行排序
        Collections.sort(lockNodes);

        // 如果当前节点是序号最小的节点,则获取到锁
        if (lockName.equals(lockPath + "/" + lockNodes.get(0))) {
            return;
        }

        // 否则,监听当前节点的前一个节点
        String prevLockName = lockNodes.get(Collections.binarySearch(lockNodes, lockName.substring(lockPath.length() + 1)) - 1);
        final CountDownLatch latch = new CountDownLatch(1);
        Stat stat = zk.exists(lockPath + "/" + prevLockName, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if (event.getType() == Event.EventType.NodeDeleted) {
                    latch.countDown();
                }
            }
        });

        // 等待前一个节点被删除
        if (stat != null) {
            latch.await();
        }
    }

    public void unlock() throws KeeperException, InterruptedException {
        // 删除当前节点
        zk.delete(lockName, -1);
    }

    public void close() throws InterruptedException {
        zk.close();
    }

    public static void main(String[] args) throws Exception {
        DistributedLock lock = new DistributedLock("localhost:2181", 5000, "/lock");
        lock.lock();
        try {
            System.out.println("获取到锁后执行操作");
        } finally {
            lock.unlock();
            lock.close();
        }
    }
}

Zookeeper 从安装到应用_分布式_02