当前位置:   article > 正文

使用Curator框架实现分布式锁_curator分布式锁

curator分布式锁

 zookeeper+springboot实现分布式锁教程(Curator

一.什么是分布式锁

分布式系统中,存在着许多进程同时运转,而为了防止分布式系统中的多个进程之间相互干扰,我们需要一种分布式协调技术来对这些进程进行调度。而这个分布式协调技术的核心就是来实现分布式锁

分布式锁:控制分布式系统有序的去对共享资源进行操作,通过互斥来保持一致性。

二.实现分布式锁的技术

  • 数据库:利用 数据库 的 唯一索引 实现。
  • Redis:利用 Redis 的 setnx 命令实现。
  • Zookeeper:利用 Zookeeper 的顺序临时节点,来实现分布式锁和等待队列。

三.什么是Curator框架

Curator是Netflix开源的一套ZooKeeper客户端框架,用于解决以下这三类问题:

  • 封装ZooKeeper clientZooKeeper server之间的连接处理;
  • 提供了一套Fluent风格的操作API;
  • 提供ZooKeeper各种应用场景(recipe, 比如共享锁服务, 集群领导选举机制)的抽象封装.

四.编码实现 

1.创建一个简单的springboot工程,在pom.xml文件导入zookeeper依赖和Curator相关依赖

  1. <!--引入对应的zookeeper -->
  2. <dependency>
  3. <groupId>org.apache.zookeeper</groupId>
  4. <artifactId>zookeeper</artifactId>
  5. <version>3.7.1</version>
  6. </dependency>
  7. <!--添加对应的curator框架依赖-->
  8. <dependency>
  9. <groupId>org.apache.curator</groupId>
  10. <artifactId>curator-framework</artifactId>
  11. <version>5.2.0</version>
  12. </dependency>
  13. <dependency>
  14. <groupId>org.apache.curator</groupId>
  15. <artifactId>curator-recipes</artifactId>
  16. <version>5.2.0</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.apache.curator</groupId>
  20. <artifactId>curator-client</artifactId>
  21. <version>5.2.0</version>
  22. </dependency>

2.开启zookeeper集群中的客户端 (至少保证集群能够正常启动)

[root@zookeeper3 ~]# zkCli.sh

 3.编写CuratorLockTest(测试分布式锁)

  1. package com.canrioyuan.zookeepertest.curator;
  2. import org.apache.curator.framework.CuratorFramework;
  3. import org.apache.curator.framework.CuratorFrameworkFactory;
  4. import org.apache.curator.framework.recipes.locks.InterProcessLock;
  5. import org.apache.curator.framework.recipes.locks.InterProcessMutex;
  6. import org.apache.curator.retry.ExponentialBackoffRetry;
  7. //使用Curator框架实现分布式锁
  8. public class CuratorLockTest {
  9. //定义锁节点的路径
  10. private String node = "/locks";
  11. //设置zookeeper连接
  12. private final String connectString = "zookeeper1:2181,zookeeper2:2181,zookeeper3:2181";
  13. //设置超时时间
  14. private final int sessionTimeout = 2000;
  15. //设置超时时间
  16. private final int connectionTimeout = 3000;
  17. public static void main(String[] args) {
  18. new CuratorLockTest().test();
  19. }
  20. private void test() {
  21. //创建分布式锁1
  22. final InterProcessLock lock1 = new InterProcessMutex(getCuratorFramework(), node);
  23. //创建分布式锁2
  24. final InterProcessLock lock2 = new InterProcessMutex(getCuratorFramework(), node);
  25. //创建线程
  26. //线程1
  27. new Thread(new Runnable() {
  28. @Override
  29. public void run() {
  30. try {
  31. //线程加锁
  32. lock1.acquire();
  33. System.out.println("线程1获取锁");
  34. //线程沉睡
  35. Thread.sleep(5*1000);
  36. //线程解锁
  37. lock1.release();
  38. System.out.println("线程1释放了锁");
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. }).start();
  44. //线程2
  45. new Thread(new Runnable() {
  46. @Override
  47. public void run() {
  48. //线程加锁
  49. try {
  50. lock2.acquire();
  51. System.out.println("线程2获取到锁");
  52. //线程沉睡
  53. Thread.sleep(5*1000);
  54. lock2.release();
  55. System.out.println("线程2释放锁");
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. }
  59. }
  60. }).start();
  61. }
  62. //对分布式锁进行初始化
  63. private CuratorFramework getCuratorFramework() {
  64. //重试策略,定义初试时间3s,重试3
  65. ExponentialBackoffRetry exponentialBackoffRetry = new ExponentialBackoffRetry(3000, 3);
  66. //初始化客户端
  67. CuratorFramework client = CuratorFrameworkFactory.builder()
  68. .connectString(connectString)
  69. .sessionTimeoutMs(sessionTimeout)
  70. .connectionTimeoutMs(connectionTimeout)
  71. .retryPolicy(exponentialBackoffRetry)
  72. .build();
  73. //开启连接
  74. client.start();
  75. System.out.println("zookeeper 初始化完成...");
  76. return client;
  77. }
  78. }

五.运行查看测试结果

线程1获取了锁

线程1释放了锁

​ 

等到线程1释放锁之后线程2才能获取到锁

​ 

线程2释放锁 

​ 

至此,我们使用Curator实现分布式锁的教程,相比起原本的API搭建。市场上更多地使用Curator来实现分布式锁,因此我们务必要掌握!!

感谢您的阅读,希望我的文章能给你带来帮助!!!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/933830
推荐阅读
相关标签
  

闽ICP备14008679号