spring boot 集成 zookeeper 实现分布式锁需使用 curator 5.x 的 interprocessmutex,配置 curator-framework 和 curator-recipes 依赖,通过 exponentialbackoffretry 初始化 curatorframework,锁路径须全局唯一,加锁用 acquire() 并配合 try-finally 确保 release(),注意 zk 集群高可用、细粒度分锁及不支持默认可重入。

Spring Boot 集成 Zookeeper 实现分布式锁,核心是借助 Curator(Zookeeper 的高级客户端)提供的 InterProcessMutex,它已封装好顺序临时节点、监听前驱节点、自动重试等逻辑,无需手动实现 zk 节点创建与监听细节。
依赖配置要选对版本
推荐使用 Curator 5.x(适配 Zookeeper 3.7+),避免老版本兼容问题。在 pom.xml 中添加:
-
curator-framework:提供基础客户端能力 -
curator-recipes:包含InterProcessMutex等开箱即用的分布式组件
示例:
<dependency><br><groupid>org.apache.curator</groupid><br><artifactid>curator-framework</artifactid><br><version>5.6.0</version><br></dependency><br><dependency><br><groupid>org.apache.curator</groupid><br><artifactid>curator-recipes</artifactid><br><version>5.6.0</version><br></dependency>
连接客户端要可靠初始化
通过 @Bean 声明 CuratorFramework 实例,并配置合理重试策略:
- 使用
RetryNTimes或ExponentialBackoffRetry,避免网络抖动导致连接失败 - 会话超时(
sessionTimeoutMs)建议设为 30s~60s,比业务操作耗时略长 - 连接地址支持集群格式,如
192.168.1.10:2181,192.168.1.11:2181,192.168.1.12:2181
配置示例(Java Config):
@Bean<br>public CuratorFramework curatorFramework() {<br> return CuratorFrameworkFactory.builder()<br> .connectString("localhost:2181")<br> .sessionTimeoutMs(60000)<br> .connectionTimeoutMs(5000)<br> .retryPolicy(new ExponentialBackoffRetry(1000, 3))<br> .build();<br>}
加锁释放要兼顾安全与简洁
直接使用 InterProcessMutex,它保证了互斥性、容错性(会话断开自动释放)、公平性(FIFO):
- 锁路径必须是**全局唯一**的,例如
/locks/order:create:10086,避免不同业务互相干扰 - 调用
acquire()是阻塞式获取,适合强一致性场景;acquire(3, TimeUnit.SECONDS)可设超时,防无限等待 -
必须配套 try-finally 使用,确保无论成功或异常都执行
release()
典型用法:
String lockPath = "/locks/inventory:decrease:" + skuId;<br>InterProcessMutex lock = new InterProcessMutex(curator, lockPath);<br>try {<br> if (lock.acquire(10, TimeUnit.SECONDS)) {<br> // 执行扣库存等临界区操作<br> updateInventory(skuId, quantity);<br> } else {<br> throw new RuntimeException("获取锁超时");<br> }<br>} finally {<br> if (lock.isAcquiredInThisProcess()) {<br> lock.release();<br> }<br>}
实际使用要注意几个关键点
Zookeeper 分布式锁不是“拿来即用”,需结合业务特性做判断:
- zk 集群本身要高可用(至少 3 节点),否则锁服务不可用将导致整个业务阻塞
- 锁粒度尽量细,比如按商品 ID 分锁,避免所有请求串行化
- 不适用于超高频短操作(如每秒万级请求),zk 的 ZNode 创建/删除开销比 Redis 大
- 若需可重入,Curator 的
InterProcessMutex默认不支持,可改用InterProcessSemaphoreMutex或自行包装
不复杂但容易忽略











