zookeeper实现分布式锁-curator,java面试项目经验案例

这篇具有很好参考价值的文章主要介绍了zookeeper实现分布式锁-curator,java面试项目经验案例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

//5.如果不是第一个节点,需要监听前一个节点

//用一个临时变量记录当前节点的上一个节点

String previousNode = firstNode;

for(String node : children){

if(currentNode.endsWith(node)){

//如果当前节点是node节点 ,那么就监听它的上一个节点 :比如 currentNode 这里是 0003节点 ,那 node就是 0002节点

//第一个参数是监听的节点,第二个参数是是否要监听,zooKeeper在初始化的时候设置好了监听器

log.info(“监听上一个节点:{}”,node);

zooKeeper.exists(path+“/”+previousNode,true);

}else{

//把children中的节点复制给上一个节点

previousNode = node;

}

}

//代码到这里,节点已经做好监听了,只需要等待,等待上一个节点完成工作后唤醒他

synchronized (this){

//wait会释放锁

wait();

}

//到这里说明被唤醒,说明获取到锁

log.info(“拿到锁:{}”,currentNode);

return true;

} catch (KeeperException e) {

e.printStackTrace();

} catch (InterruptedException e) {

e.printStackTrace();

}

return false;

}

@Override

public void close() {

//释放锁 :节点路径, 节点版本号(-1匹配所有版本)

log.info(“释放节点:{}”,currentNode);

if(null != currentNode){

try {

zooKeeper.delete(currentNode ,-1);

} catch (InterruptedException e) {

e.printStackTrace();

} catch (KeeperException e) {

e.printStackTrace();

}

}

}

@Override

public void process(WatchedEvent watchedEvent) {

//当节点被释放,就会到这里被监听到

if(watchedEvent.getType() == Event.EventType.NodeDeleted){

synchronized (this){

//唤醒等待的线程

log.info(“当前节点:{},唤醒”,watchedEvent.getPath());

notify();

}

}

}

}

2.3.测试代码

public class ZKTest {

@Test

public void testZK() throws Exception {

for(int i = 0 ; i < 10 ; i++){

new Thread(()->{

ZookeeperLock zookeeperLock = new ZookeeperLock();

boolean getLock = zookeeperLock.getLock(“order”);

System.out.println(“是否获取到锁:”+getLock);

zookeeperLock.close();

}).start();

}

Thread.sleep(5000);

}

}

打印日志:

09:18:24.500 [Thread-0] INFO cn.itsource.ZookeeperLock - /order/order0000000014监听上一个节点:/order/order0000000013

09:18:24.500 [Thread-9] INFO cn.itsource.ZookeeperLock - /order/order0000000017监听上一个节点:/order/order0000000016

09:18:24.500 [Thread-1] INFO cn.itsource.ZookeeperLock - /order/order0000000019监听上一个节点:/order/order0000000018

09:18:24.500 [Thread-8] INFO cn.itsource.ZookeeperLock - /order/order0000000018监听上一个节点:/order/order0000000017

09:18:24.500 [Thread-4] INFO cn.itsource.ZookeeperLock - /order/order0000000016监听上一个节点:/order/order0000000015

09:18:24.500 [Thread-2] INFO cn.itsource.ZookeeperLock - /order/order0000000020监听上一个节点:/order/order0000000019

09:18:24.500 [Thread-3] INFO cn.itsource.ZookeeperLock - /order/order0000000013监听上一个节点:/order/order0000000012

09:18:24.500 [Thread-7] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000011

09:18:24.500 [Thread-6] INFO cn.itsource.ZookeeperLock - /order/order0000000015监听上一个节点:/order/order0000000014

09:18:24.500 [Thread-5] INFO cn.itsource.ZookeeperLock - /order/order0000000012监听上一个节点:/order/order0000000011

09:18:24.509 [Thread-5-EventThread] INFO cn.itsource.ZookeeperLock - 当前节点:/order/order0000000011,唤醒

09:18:24.509 [Thread-5] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000012

是否获取到锁:true

09:18:24.509 [Thread-5] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000012

09:18:24.511 [Thread-3-EventThread] INFO cn.itsource.ZookeeperLock - 当前节点:/order/order0000000012,唤醒

09:18:24.512 [Thread-3] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000013

是否获取到锁:true

09:18:24.512 [Thread-3] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000013

09:18:24.514 [Thread-0-EventThread] INFO cn.itsource.ZookeeperLock - 当前节点:/order/order0000000013,唤醒

09:18:24.515 [Thread-0] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000014

是否获取到锁:true

09:18:24.515 [Thread-0] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000014

09:18:24.517 [Thread-6-EventThread] INFO cn.itsource.ZookeeperLock - 当前节点:/order/order0000000014,唤醒

09:18:24.517 [Thread-6] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000015

是否获取到锁:true

09:18:24.517 [Thread-6] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000015

09:18:24.520 [Thread-4-EventThread] INFO cn.itsource.ZookeeperLock - 当前节点:/order/order0000000015,唤醒

09:18:24.520 [Thread-4] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000016

是否获取到锁:true

09:18:24.520 [Thread-4] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000016

09:18:24.522 [Thread-9] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000017

是否获取到锁:true

09:18:24.522 [Thread-9] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000017

09:18:24.525 [Thread-8-EventThread] INFO cn.itsource.ZookeeperLock - 当前节点:/order/order0000000017,唤醒

09:18:24.525 [Thread-8] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000018

是否获取到锁:true

09:18:24.525 [Thread-8] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000018

09:18:24.527 [Thread-1-EventThread] INFO cn.itsource.ZookeeperLock - 当前节点:/order/order0000000018,唤醒

09:18:24.527 [Thread-1] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000019

是否获取到锁:true

09:18:24.527 [Thread-1] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000019

09:18:24.530 [Thread-2-EventThread] INFO cn.itsource.ZookeeperLock - 当前节点:/order/order0000000019,唤醒

09:18:24.530 [Thread-2] INFO cn.itsource.ZookeeperLock - 拿到锁:/order/order0000000020

是否获取到锁:true

09:18:24.530 [Thread-2] INFO cn.itsource.ZookeeperLock - 释放节点:/order/order0000000020

这个效果看起来是对的。但是如果自己基于zookeeper封装分布式锁未免太过麻烦,而且容易出BUG,Apache提供了一个基于Zookeeper的客户端工具curator已经实现了分布式锁的封装,我们使用它就可以了。

3.使用curator实现分布式锁

3.1.curator介绍

Apache Curator是用于Apache ZooKeeper(一种分布式协调服务)的Java / JVM客户端库。它包括一个高级API框架和实用程序,使使用Apache ZooKeeper变得更加轻松和可靠。解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。

重点是它对分布式锁进行了封装 :http://curator.apache.org/getting-started.html

3.1.导入依赖

org.apache.curator

curator-recipes

4.1.0

3.2.配置curator

//初始化方法start

@Bean(initMethod = “start”,destroyMethod = “close”)

public CuratorFramework curatorFramework(){

//重试策略

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);

//创建客户端

CuratorFramework client = CuratorFrameworkFactory.newClient(“172.16.2.54:2181”, retryPolicy);

return client;

}

3.3.分布式锁案例

@Slf4j

@RunWith(SpringRunner.class)

@SpringBootTest(classes = AppStart.class)

public class ZKTest {

@Autowired

private CuratorFramework curatorFramework;

/**======================================================================================

  • 方法描述:使用curator实现分布式锁

======================================================================================*/

@Test

public void testCurator() throws Exception {

for(int i = 0 ; i < 10 ; i++){

new Thread(()->{

testCuratorLock();

}).start();

}

Thread.sleep(5000);

}

public void testCuratorLock(){

//分布式锁

InterProcessMutex lock = new InterProcessMutex(curatorFramework, “/order”);

try {

if ( lock.acquire(1, TimeUnit.SECONDS) ){

//处理业务逻辑

log.info(“获取到锁”);

}

} catch (Exception e) {

e.printStackTrace();

} finally{

try {

//释放锁

log.info(“释放锁”);

lock.release();

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

打印效果

2021-05-15 09:54:32.251 INFO 22488 — [ Thread-4] cn.itsource.ZKTest : 获取到锁

2021-05-15 09:54:32.252 INFO 22488 — [ Thread-4] cn.itsource.ZKTest : 释放锁

2021-05-15 09:54:32.267 INFO 22488 — [ Thread-9] cn.itsource.ZKTest : 获取到锁

2021-05-15 09:54:32.267 INFO 22488 — [ Thread-9] cn.itsource.ZKTest : 释放锁

2021-05-15 09:54:32.274 INFO 22488 — [ Thread-5] cn.itsource.ZKTest : 获取到锁

2021-05-15 09:54:32.274 INFO 22488 — [ Thread-5] cn.itsource.ZKTest : 释放锁

2021-05-15 09:54:32.277 INFO 22488 — [ Thread-8] cn.itsource.ZKTest : 获取到锁

2021-05-15 09:54:32.277 INFO 22488 — [ Thread-8] cn.itsource.ZKTest : 释放锁

2021-05-15 09:54:32.280 INFO 22488 — [ Thread-6] cn.itsource.ZKTest : 获取到锁

2021-05-15 09:54:32.280 INFO 22488 — [ Thread-6] cn.itsource.ZKTest : 释放锁

2021-05-15 09:54:32.283 INFO 22488 — [ Thread-3] cn.itsource.ZKTest : 获取到锁

2021-05-15 09:54:32.283 INFO 22488 — [ Thread-3] cn.itsource.ZKTest : 释放锁

2021-05-15 09:54:32.285 INFO 22488 — [ Thread-11] cn.itsource.ZKTest : 获取到锁

2021-05-15 09:54:32.286 INFO 22488 — [ Thread-11] cn.itsource.ZKTest : 释放锁

2021-05-15 09:54:32.288 INFO 22488 — [ Thread-10] cn.itsource.ZKTest : 获取到锁

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper
zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper
zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper
zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper
zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper
zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper

最后

学习视频:

zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper

大厂面试真题:

zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
zookeeper实现分布式锁-curator,java面试项目经验案例,2024年程序员学习,分布式,java-zookeeper,zookeeper

12783395680)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-1CbfUkuU-1712783395680)]

最后

学习视频:

[外链图片转存中…(img-c1uSi6n1-1712783395681)]

大厂面试真题:

[外链图片转存中…(img-bDNavV7J-1712783395681)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-MNG6bBq9-1712783395681)]文章来源地址https://www.toymoban.com/news/detail-856542.html

到了这里,关于zookeeper实现分布式锁-curator,java面试项目经验案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java中利用Redis,ZooKeeper,数据库等实现分布式锁(遥遥领先)

    1.1 什么是分布式锁 在我们进行单机应用开发涉及并发同步的时候,我们往往采用synchronized或者ReentrantLock的方式来解决多线程间的代码同步问题。但是当我们的应用是在分布式集群工作的情况下,那么就需要一种更加高级的锁机制,来处理种跨机器的进程之间的数据同步问题

    2024年02月03日
    浏览(43)
  • 微服务面试问题小结( 微服务、分布式、MQ、网关、zookeeper、nginx)

    单体架构 优点:架构简单,维护成本低 缺点:各个模块耦合度太高,当对一个模块进行更新修改时,会影响到其他模块,要一起进行修改。当存在性能瓶颈的时候,需要对整个服务进行扩容,不能有针对性的扩容,如一个程序的主要功能时其中某个服务,要对其增加机器,

    2024年02月04日
    浏览(36)
  • 分布式锁解决方案_Zookeeper实现分布式锁

    提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 分布式锁解决方案_Zookeeper实现分布式锁 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 提示:这里可以添加本文要记录的大概内容: Zookeeper 是一个开源的分布式协调服务,它

    2024年02月03日
    浏览(34)
  • 分布式锁实现方案-基于zookeeper的分布式锁实现(原理与代码)

    目录 一、基于zookeeper的分布式锁 1.1 基于Zookeeper实现分布式锁的原理 1.1.1 分布式锁特性说明 1.1.1.1 特点分析 1.1.1.2 本质 1.1.2 Zookeeper 分布式锁实现原理 1.1.2.1 Zookeeper临时顺序节点特性 1.1.2.2 Zookeeper满足分布式锁基本要求 1.1.2.3 Watcher机制 1.1.2.3 总结 1.2 分布式锁流程说明 1.2.1

    2024年04月24日
    浏览(35)
  • Zookeeper实现分布式锁

    ZooKeeper是一个分布式协调服务,其中提供的序列化、持久化、有层次的目录结构使得它非常适合用于实现分布式锁。在ZooKeeper中,分布式锁通常通过临时有序节点实现。以下是ZooKeeper分布式锁的详细介绍:  实现方式: 临时有序节点: 当一个客户端需要获取锁时,它在ZooK

    2024年02月02日
    浏览(51)
  • 基于zookeeper实现分布式锁

    目录 zookeeper知识点复习 相关概念 java客户端操作 实现思路分析  基本实现 初始化链接 代码落地  优化:性能优化  实现阻塞锁 监听实现阻塞锁 优化:可重入锁 zk分布式锁小结  Zookeeper(业界简称zk)是一种提供配置管理、分布式协同以及命名的中心化服务,这些提供的 功

    2024年02月02日
    浏览(55)
  • 使用ZooKeeper实现分布式锁

    目录 引言 1. ZooKeeper简介 2. 分布式锁实现原理 3. 分布式锁实现步骤 步骤一:创建ZooKeeper客户端 步骤二:创建分布式锁类 步骤三:使用分布式锁 4. 总结 在分布式系统中,实现分布式锁是一项常见的任务,可以用于保证同一时间只有一个客户端可以访问共享资源,从而避免竞

    2024年02月21日
    浏览(41)
  • 【分布式锁】06-Zookeeper实现分布式锁:可重入锁源码分析

    前言 前面已经讲解了Redis的客户端Redission是怎么实现分布式锁的,大多都深入到源码级别。 在分布式系统中,常见的分布式锁实现方案还有Zookeeper,接下来会深入研究Zookeeper是如何来实现分布式锁的。 Zookeeper初识 文件系统 Zookeeper维护一个类似文件系统的数据结构 image.png 每

    2024年02月22日
    浏览(41)
  • 3、基于Zookeeper实现分布式锁

    3.1.1 安装启动 如下,说明启动成功: 3.1.2 相关概念 Zookeeper提供一个多层级的节点命名空间(节点称为znode),每个节点都用一个以斜杠(/)分隔的路径表示,而且每个节点都有父节点(根节点除外),非常类似于文件系统。并且每个节点都是唯一的。 1、znode节点有四种类型

    2024年02月15日
    浏览(32)
  • SpringBoot基于Zookeeper实现分布式锁

    研究分布式锁,基于ZK实现,需要整合到SpringBoot使用 参考自SpringBoot集成Curator实现Zookeeper基本操作,Zookeeper入门 本篇的代码笔者有自己运行过,需要注意组件的版本号是否兼容,否则会有比较多的坑 采用Docker compose快速搭建ZK容器,很快,几分钟就好了,而且是集群方式搭建

    2024年02月12日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包