之前说过了springboot实现redis的分布式锁,今天来一起研究下zk的分布式锁实现!
下面进入主题哈
我们先来复习下什么叫zookeeper
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,它是集群的管理者,监视着集群中各个节点的状态
根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户
ZooKeeper提供了文件系统和通知机制
ZooKeeper的作用
1.命名服务 2.配置管理 3.集群管理 4.分布式锁 5.队列管理
Zookeeper集群管理
所谓集群管理无在乎两点:是否有机器退出和加入、选举master。
对于第一点,所有机器约定在父目录GroupMembers下创建临时目录节点,然后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper的连接断开,其所创建的临时目录节点被删除,所有其他机器都收到通知:某个兄弟目录被删除,于是,所有人都知道:它上船了。
新机器加入也是类似,所有机器收到通知:新兄弟目录加入,highcount又有了,对于第二点,我们稍微改变一下,所有机器创建临时顺序编号目录节点,每次选取编号最小的机器作为master就好。
Zookeeper分布式锁
有了zookeeper的一致性文件系统,锁的问题变得容易。锁服务可以分为两类,一个是保持独占,另一个是控制时序。
对于第一类,我们将zookeeper上的一个znode看作是一把锁,通过createznode的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的distribute_lock 节点就释放出锁。
对于第二类, /distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和选master一样,编号最小的获得锁,用完删除,依次方便。
至于zk的原理,咱们后续再说,今天的主要是如何实现zk分布式锁,下面咱们直接上代码啊,
第一步:添加依赖
第二步:创建zkBean也就是初始化ZookeeperLockRegistry
第三步:编写测试代码,代码比较简单,注入我们之前初始化好的ZookeeperLockRegistry,每执行一次,num-1,
第四步:安装zk,我这里是直接在win下面操作的,小伙伴们可以在linux上安装zk哈,过程比较简单,就不再赘述了(注意一点,在linux安装zk集群的时候,挡在一台机器上自动后,使用命令zkServer.sh status查看,会显示连接失败,这个时候,不要着急,把剩余的全部启动,再次查看就是正常的了)
本地的话比较简单.再接在bin下启动如下命令就可以启动zk啦
第五步:咱们配置个jmeter来执行测试下啊
配置了50个线程同时访问,
第六步:接下来咱们启动项目哈,然后开始运行jmeter看看效果
证明是可以的哈,达到目标哈,这就是一个简单的zk实现分布式锁的效果
我们在吧zk锁的逻辑去掉,再试一下
看看执行后的结果,真的是惨不忍睹啊,全抢着了
证明咱们zk的分布式锁已经实现,简单吧 ,下一期咱们来分析喜源码到底是怎么借助zk实现分布式所得 thanks!
网友评论