自定义zkLock
# 前言
由于公司的代码不方便分享, 本篇只提供大致思路
Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。本篇主要使用到curator中的InterProcessMutex
类进行加锁解锁操作, InterProcessMutex
具体原理及使用方法请自行百度
# 目标
- 提供注解及内部类两种方式进行加锁
- 两种加锁方式内部实现保持一致, 尽可能使用同一套代码, 方便后期维护
- 注解方式支持sel表达式
- 内部类方式采用类似于
TransactionTemplate
方式注入后进行使用 - 尽可能支持多种锁类型(公平锁, 读写锁), 默认为公平锁
- 支持自定义加锁超时策略, 并提供默认超时策略
- 该代码为框架代码, 需保持导入简单, 最好进行maven引用后, 只需要配置zk链接地址就可以正常使用
# 思路
# 锁主体逻辑
通过源码可知读写锁的实现是对 InterProcessMutex
的子类, 具体的加锁解锁方法和公平锁是一致的,
InterProcessMutex fair = new InterProcessMutex(client, FAIR_ROOT_PATH + lockValue);
InterProcessMutex read = new InterProcessReadWriteLock(client, READ_WRITE_ROOT_PATH + lockValue).readLock();
InterProcessMutex write = new InterProcessReadWriteLock(client, READ_WRITE_ROOT_PATH + lockValue).writeLock();
1
2
3
2
3
我们可以将加锁解锁的方法都写在抽象类中AbsLock
, 通过子类来实现InterProcessMutex
的初始化, 同时加入工厂模式, 依据传入的枚举类型来确定锁的前缀及锁类型, 这样在注解及内部类都可以调用AbsLock
来进行加锁解锁
# 锁超时策略
锁超时策略可以通过接口方式传入内部类执行器中, 具体的策略可以保证自定义
# 类扫描问题
把需要扫描的类配置到 src/main/resources/META-INF/spring.factories
文件中, 使项目引用后可以直接扫描到
# 结语
其实整体实现很简单, 但是还是有很多的细节在里面, 整体写完后会对自己框架设计上有很大的启发
上次更新: 2021/06/04, 16:31:43