作者:程序员小航 2021-07-08 09:21:17
大数据
分布式 一般工作中常用的分布式锁,就是基于 Redis 和 ZooKeeper,前面已经介绍完了 Redisson 锁相关的源码,下面一起看看基于 ZooKeeper 的锁。也就是 Curator 这个框架。
创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于网站设计、成都网站设计、嘉祥网络推广、微信小程序开发、嘉祥网络营销、嘉祥企业策划、嘉祥品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联公司为所有大学生创业者提供嘉祥建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
一般工作中常用的分布式锁,就是基于 Redis 和 ZooKeeper,前面已经介绍完了 Redisson 锁相关的源码,下面一起看看基于 ZooKeeper 的锁。也就是 Curator 这个框架。
Curator 的锁也分为很多种,本文分析共享可重入锁。
考虑到如果文章篇幅较长,不太适合阅读,所以对文章做了适当的拆分。
本机三个节点
版本:3.7.0 系统:macOS 安装方式:brew install zookeeper Curator Maven 依赖版本:5.1.0
org.apache.curator curator-recipes 5.1.0
详细信息可参考官方文档[1]。
加锁前
在加锁之前,ZooKeeper 仅有一个节点 /zookeeper。
加锁中
在 /locks/lock_01 路径上加锁。
加锁之后:
PS:下面代码截图中的代码风格就是 Curator 源码的代码风格。
入口
InterProcessMutex#internalLock
开始先从 threadData 中获取当前线程,这里肯定是没有的,所以进入 attemptLock 方法。
本方法中还包含了锁重入的逻辑,后面也会介绍。
加锁
LockInternals#attemptLock
核心部分就是这两行:
创建临时顺序节点
StandardLockInternalsDriver#createsTheLock
可以看出节点的 mode 是 CreateMode.EPHEMERAL_SEQUENTIAL,表示这是一个临时顺序节点!
进入 CreateBuilderImpl#forPath(java.lang.String, byte[])
client.getDefaultData() 就是本机 IP 地址。
这个 adjustPath 方法看名字就是在调整路径之类的。会生成一个 UUID 拼接到 /locks/lock_01 中,变成 /locks/lock_01/_c_UUID-lock-。
因为创建的是临时顺序节点,所以会自动在后面添加顺序,最终变为 /locks/lock_01/_c_UUID-lock-0000000000。
具体创建节点是在 CreateBuilderImpl#pathInForeground 中。
创建临时节点,如果路径存在,会创建成功,如果路径不存在会创建失败;
创建失败后,先创建路径,再创建节点。
本篇文章主要介绍了基于 ZooKeeper 的分布式锁框架 Curator 的使用,以及加锁流程,源码分析。
下面对内容做下总结:
重点需要关注的是:
引用链接:
[1]ZooKeeper Shared Reentrant Lock: https://curator.apache.org/curator-recipes/shared-reentrant-lock.html
本文转载自微信公众号「程序员小航」,可以通过以下二维码关注。转载本文请联系程序员小航公众号。
文章标题:ZooKeeper分布式锁Curator源码之一:可重入锁
文章源于:http://www.stwzsj.com/qtweb/news14/264.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联