一 序

在window上使用zookeeper实现简单的分布式锁,并配合使用可视化界面zkui

二 安装zookeeper

下载安装zookeeper
  • 上官网下载最新zookeeper 官网下载.
  • 如果官网下载太慢,可使用我的zookeeper3.5.4版本

链接:https://pan.baidu.com/s/1PxdloBT1GJvHIFHh9mCtWQ
提取码:oq9l

踩坑

如果去官网下载的小伙伴一定要注意了,现在的版本的已经把编译和未编译的版本分开成了两个项目。应该是从3.5.4后的版本开始。
所以大家下载的时候一定要下载尾缀有 -bin 的文件。

zookeeper的ui控制台_zookeeper


点击第一个链接,里面是编译好的项目。

zookeeper的ui控制台_jar_02


选择任意一个项目后缀带 -bin 的连接进行下载就行了。

本地配置zookeeper

现在我把下载好的zookeeper解压并放在了D盘下,

  • 外层zookeeper文件夹是自己新创建的
  • zookeeper-3.5.4-beta文件夹则是解压出来的
  • 并在zookeeper文件夹下创建两个文件夹 datalog
  • 进入zookeeper包中的conf文件夹中
  • 找到尾缀为 .cfg 文件,复制一份在当前目录下并修改名称为 zoo.cfg,或者直接在原文件上修改。

    这里我直接修改为zoo.cfg
  • 记事本打开修改好的zoo.cfg
  • 新增两行并保存

dataDir=D:\zookeeper\data
dataLogDir=D:\zookeeper\log

dataDir为刚才自己新建的data路径

dataLogDir为新建的log路径

zookeeper的ui控制台_可视化_03

本地启动zookeeper
  • 首先进入zookeeper的bin文件下
  • 首先命令行启动服务 zkserver.cmd,或者双击zkserver.cmd
  • 过后命令行启动 zkCli.cmd,或者双击zkCli.cmd(显示如下界面就是启动成功了)

三 安装可视化界面 zkui

下载zkui

链接:https://pan.baidu.com/s/1F3PqyrZB46l0z_GWYDV10g
提取码:a2wv

配置安装zkui
  • 把下载好的zkui解压并放在d盘下

    注:因为zkui没有提供编译好的包,所以需要我们自己编译并打包运行

方式一: 可使用命令行打包(前提是本地需要先配置maven)

  • 首先编译项目命令
mvn clean compile
  • 然后打包项目
mvn clean package

方式二:使用idea进行打包(本教程使用的)

  • 使用idea打开zkui项目
  • 首先双击 clean,成功后,再次双击package进行打包
  • 上述操作完成后,会新生产一个terget文件,在文件中会有刚刚生成的jar包
  • 然后在zkui文件里找到 config.cfg 并打开
  • 配置自己的zookeeper地址
  • 修改完后,需要把 config.cfg文件复制一份放在和 刚刚打好的 jar包同一级的目录文件下(很重要)
启动zkui
  • 直接在当前文件夹下 cmd命名行运行
  • 弹出命令框,进行jar运行,输入并回车
java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar

zookeeper的ui控制台_zookeeper_04

这样就是运行成功了

  • 本地访问 localhost:9090
  • 输入默认账号: admin 密码 : manger

    着就算完成了,启动zookeeper一起使用。
四 实现简单的分布式锁
  • 使用idea创建一个maven项目
  • 引入依赖
<dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>5.1.0</version>
        </dependency>
  • 代码实现
public class ZookeeperLockTest {
        public static void main(String[] args)  {
            CuratorFramework zkClient = getZkClient();
            String lockPath = "/lock";
            InterProcessMutex lock = new InterProcessMutex(zkClient, lockPath);
            //模拟50个线程抢锁
            for (int i = 0; i < 50; i++) {
                new Thread(new TestThread(i, lock)).start();
            }
        }


        static class TestThread implements Runnable {
            private Integer threadFlag;
            private InterProcessMutex lock;

            public TestThread(Integer threadFlag, InterProcessMutex lock) {
                this.threadFlag = threadFlag;
                this.lock = lock;
            }

            public void run() {
                try {
                    lock.acquire();
                    System.out.println("第"+threadFlag+"线程获取到了锁");
                    //等到1秒后释放锁
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }finally {
                    try {
                        lock.release();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }

        private static CuratorFramework getZkClient() {
            String zkServerAddress = "localhost:2181";
            ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3, 5000);
            CuratorFramework zkClient = CuratorFrameworkFactory.builder()
                    .connectString(zkServerAddress)
                    .sessionTimeoutMs(5000)
                    .connectionTimeoutMs(5000)
                    .retryPolicy(retryPolicy)
                    .build();
            zkClient.start();
            return zkClient;
        }

}
  • 运行main方法,控制台打印

    在 线程抢锁期间,刷新页面查看 zkui 界面下的 lock文件夹下面的数据

    当项目运行完成后,相应的lock文件也会被释放销毁,刷新页面如下

    详细简单分布式锁的解析可查看地址 :传送