springboot+zookeeper实现分布式锁


Posted in Java/Android onMarch 21, 2022

springboot+zookeeper实现分布式锁

InterProcessMutex内部实现了zookeeper分布式锁的机制,所以接下来我们尝试使用这个工具来为我们的业务加上分布式锁处理的功能

zookeeper分布式锁的特点:1、分布式 2、公平锁 3、可重入

依赖

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.4.10</version>
</dependency>
<!-- zookeeper 客户端 -->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-framework</artifactId>
   <version>2.12.0</version>
</dependency>
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-recipes</artifactId>
   <version>2.12.0</version>
</dependency>
<!-- lombok -->
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.16</version>
   <scope>provided</scope>
</dependency>

本地封装

这个工具类主要封装CuratorFramework这个client(连接Zookeeper)

@Slf4j
public class CuratorClientUtil {
    private String zookeeperServer;

    @Getter
    private CuratorFramework client;

    public CuratorClientUtil(String zookeeperServer) {
        this.zookeeperServer = zookeeperServer;
    }

  	// 创建CuratorFrameworkFactory并且启动
    public void init() {
       // 重试策略,等待1s,最大重试3次
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
        this.client = CuratorFrameworkFactory.builder()
                .connectString(zookeeperServer)
                .sessionTimeoutMs(5000)
                .connectionTimeoutMs(5000)
                .retryPolicy(retryPolicy)
                .build();
        this.client.start();
    }

   // 容器关闭,CuratorFrameworkFactory关闭
    public void destroy() {
        try {
            if (Objects.nonNull(getClient())) {
                getClient().close();
            }
        } catch (Exception e) {
            log.info("CuratorFramework close error=>{}", e.getMessage());
        }
    }
}

配置

@Configuration
public class CuratorConfigration {
    @Value("${zookeeper.server}")
    private String zookeeperServer;
    // 注入时,指定initMethod和destroyMethod
    @Bean(initMethod = "init", destroyMethod = "destroy")
    public CuratorClientUtil curatorClientUtil() {
        CuratorClientUtil clientUtil = new CuratorClientUtil(zookeeperServer);
        return clientUtil;
    }
}

测试代码

模拟不同客户端的请求

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
    // 注入client工具类
    @Autowired
    private CuratorClientUtil curatorClientUtil;
    // 在zookeeper的/rootLock节点下创建锁对应的临时有序节点
    private String rootLock = "/rootLock";

    @GetMapping("/testLock")
    public Object testLock() throws Exception {
        // 获取当前线程的名字,方便观察那些线程在获取锁
        String threadName = Thread.currentThread().getName();
        InterProcessMutex mutex = new InterProcessMutex(curatorClientUtil.getClient(), rootLock);
        try {
            log.info("{}---获取锁start", threadName);
            // 尝试获取锁,最长等待3s,超时放弃获取
            boolean lockFlag = mutex.acquire(3000, TimeUnit.SECONDS);
            // 获取锁成功,进行业务处理
            if (lockFlag) {
                log.info("{}---获取锁success", threadName);
                // 模拟业务处理,时间为3s
                Thread.sleep(3000);
            } else {
                log.info("{}---获取锁fail", threadName);
            }
        } catch (Exception e) {
            log.info("{}---获取锁异常", threadName);
        } finally {
            // 业务处理完成,释放锁,唤醒比当前线程创建的节点序号大(最靠近)的线程获取锁
            mutex.release();
            log.info("{}---锁release", threadName);
        }
        return "线程:" + threadName + "执行完成";
    }
}

JMeter测试

我们使用JMeter模拟100个客户端同时并发的访问 localhost:8081/test/testLock,相当于100个客户端争抢分布式锁,结果如图右上角所示,100个请求花了5分6s,每个线程获取到锁后业务处理3s,100个线程理想时间为300s(Thread.sleep(3000)),所以运行时间符合。
springboot+zookeeper实现分布式锁springboot+zookeeper实现分布式锁

zookeeper每个线程在/rooLock节点下创建的临时有序节点如下图,由于是临时的,所以线程释放锁后这些节点也会删除
springboot+zookeeper实现分布式锁
100个线程程序日志打印
springboot+zookeeper实现分布式锁

关于InterProcessMutex内部如何实现zookeeper分布式锁,请看我写的这篇文章:在这里

Java/Android 相关文章推荐
分析设计模式之模板方法Java实现
Jun 23 Java/Android
解决SpringCloud Feign传对象参数调用失败的问题
Jun 23 Java/Android
Netty结合Protobuf进行编解码的方法
Jun 26 Java/Android
mybatis 解决从列名到属性名的自动映射失败问题
Jun 30 Java/Android
java设计模式--原型模式详解
Jul 21 Java/Android
Spring Boot 排除某个类加载注入IOC的操作
Aug 02 Java/Android
Java比较两个对象中全部属性值是否相等的方法
Aug 07 Java/Android
Mybatis是这样防止sql注入的
Dec 06 Java/Android
SpringBoot整合阿里云视频点播的过程详解
Dec 06 Java/Android
Java设计模式之享元模式示例详解
Mar 03 Java/Android
Android 中的类文件和类加载器详情
Jun 05 Java/Android
Android Gradle 插件自定义Plugin实现注意事项
Jun 16 Java/Android
Mybatis-Plus进阶分页与乐观锁插件及通用枚举和多数据源详解
Mar 21 #Java/Android
Spring this调用当前类方法无法拦截的示例代码
SpringCloud Feign请求头删除修改的操作代码
Mar 20 #Java/Android
JavaWeb实现显示mysql数据库数据
关于Mybatis中SQL节点的深入解析
springboot 自定义配置 解决Boolean属性不生效
Mar 18 #Java/Android
使用Java去实现超市会员管理系统
Mar 18 #Java/Android
You might like
PHP 线程安全与非线程安全版本的区别深入解析
2013/08/06 PHP
codeigniter框架The URI you submitted has disallowed characters错误解决方法
2014/05/06 PHP
一个PHP实现的轻量级简单爬虫
2015/07/08 PHP
php根据数据id自动生成编号的实现方法
2016/10/16 PHP
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
Summernote实现图片上传功能的简单方法
2016/07/11 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
微信小程序 JS动态修改样式的实现代码
2017/02/10 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
2019/04/10 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
js实现图片粘贴到网页
2019/12/06 Javascript
[04:52]DOTA2亚洲邀请赛附加赛 TOP10精彩集锦
2015/01/29 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
用Python脚本生成Android SALT扰码的方法
2013/09/18 Python
微信跳一跳python自动代码解读1.0
2018/01/12 Python
Python实现聊天机器人的示例代码
2018/07/09 Python
Python干货:分享Python绘制六种可视化图表
2018/08/27 Python
python 使用elasticsearch 实现翻页的三种方式
2020/07/31 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
Python如何急速下载第三方库详解
2020/11/02 Python
pytorch 计算Parameter和FLOP的操作
2021/03/04 Python
英语自荐信范文
2013/12/11 职场文书
实用的简历自我评价
2014/03/06 职场文书
共产党员公开承诺书
2014/03/25 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
投资意向书
2014/07/30 职场文书
2014领导班子四风问题查摆思想汇报
2014/09/13 职场文书
模范教师材料大全
2014/12/16 职场文书
2015年清明节活动总结
2015/02/09 职场文书
2016年六一文艺汇演开幕词
2016/03/04 职场文书