一 序
在window上使用zookeeper实现简单的分布式锁,并配合使用可视化界面zkui
二 安装zookeeper
下载安装zookeeper
- 上官网下载最新zookeeper 官网下载.
- 如果官网下载太慢,可使用我的zookeeper3.5.4版本
链接:https://pan.baidu.com/s/1PxdloBT1GJvHIFHh9mCtWQ
提取码:oq9l
踩坑
如果去官网下载的小伙伴一定要注意了,现在的版本的已经把编译和未编译的版本分开成了两个项目。应该是从3.5.4后的版本开始。
所以大家下载的时候一定要下载尾缀有 -bin 的文件。
点击第一个链接,里面是编译好的项目。
选择任意一个项目后缀带 -bin 的连接进行下载就行了。
本地配置zookeeper
现在我把下载好的zookeeper解压并放在了D盘下,
- 外层zookeeper文件夹是自己新创建的
- zookeeper-3.5.4-beta文件夹则是解压出来的
- 并在zookeeper文件夹下创建两个文件夹 data 和 log
- 进入zookeeper包中的conf文件夹中
- 找到尾缀为 .cfg 文件,复制一份在当前目录下并修改名称为 zoo.cfg,或者直接在原文件上修改。
这里我直接修改为zoo.cfg - 记事本打开修改好的zoo.cfg
- 新增两行并保存
dataDir=D:\zookeeper\data
dataLogDir=D:\zookeeper\log
dataDir为刚才自己新建的data路径
dataLogDir为新建的log路径
本地启动zookeeper
- 首先进入zookeeper的bin文件下
- 首先命令行启动服务 zkserver.cmd,或者双击zkserver.cmd
- 过后命令行启动 zkCli.cmd,或者双击zkCli.cmd(显示如下界面就是启动成功了)
三 安装可视化界面 zkui
下载zkui
- github下载
- 第二种就是自己提前下载好的
链接: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
这样就是运行成功了
- 本地访问 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文件也会被释放销毁,刷新页面如下
详细简单分布式锁的解析可查看地址 :传送