springboot集成zookeeper,springboot 分布式锁
目录
依赖本地封装配置测试代码测试工具测试进程间互斥内部实现了动物园管理员分布式锁的机制,所以接下来我们尝试使用这个工具来为我们的业务加上分布式锁处理的功能
动物园管理员分布式锁的特点:1、分布式2、公平锁3、可重入
依赖
依赖关系groupIdorg.apache.zookeeper/groupId人工动物园管理员/人工动物园版本3 .4 .10/版本/依赖关系!-动物园管理员客户端-依赖groupIdorg.apache.curator/groupId工艺品Id馆长-框架/artifactId版本2 .12 .0/版本/依赖依赖groupIdorg.apache.curator/groupId工艺品Id馆长-食谱/artifactId版本2 .12 .0/版本/依赖!-lombok-dependency groupIdorg.projectlombok/groupId artifact id lombok/artifact id版本1 .18 .16/版本范围提供的/范围/依赖项
本地封装
这个工具类主要封装策展框架这个客户端(连接动物园管理员)
@ SLF 4j公共类CuratorClientUtil {私有字符串zookeeperServer@Getter private CuratorFramework客户端;public CuratorClientUtil(String zookeeperServer){ this。zookeeperServer=zookeeperServer;} //创建馆长框架工厂并且启动public void init() { //重试策略,等待1s,最大重试3次RetryPolicy RetryPolicy=new ExponentialBackoffRetry(1000,3);这个。client=curatorframeworkfactory。构建器().连接字符串(zookeeperServer).sessionTimeoutMs(5000).connectionTimeoutMs(5000).retryPolicy(retryPolicy).build();这个。客户。start();} //容器关闭,策展人框架工厂关闭public void destroy(){ try { if(objects。nonnull(getClient()){ getClient().close();} } catch(异常e){ log。info(策展人框架关闭错误={ } ,e . getmessage());} }}
配置
@配置公共类馆长配置{ @ Value( $ { zookeeper。服务器} )私有字符串zookeeperServer//注入时,指定初始化和destroy method @ Bean(init method= init ,destroy method= destroy )public CuratorClientUtil CuratorClientUtil(){ CuratorClientUtil client util=new CuratorClientUtil(zookeeperServer);返回clientUtil}}
测试代码
模拟不同客户端的请求
@ Slf4j @ rest控制器@请求映射(/test )公共类TestController { //注入客户工具类@ Autowired private CuratorClientUtil CuratorClientUtil;//在动物园管理员的/rootLock节点下创建锁对应的临时有序节点私有字符串根锁=/根锁;@GetMapping(/testLock )公共对象测试锁()引发异常{ //获取当前线程的名字,方便观察那些线程在获取锁字符串线程名称=线程。当前线程().getName();InterProcessMutex mutex=新的InterProcessMutex(curatorclientutil。get client(),根锁);请尝试{日志。信息( { } --获取锁start ,线程名);//尝试获取锁,最长等待3s,超时放弃获取布尔锁标志=互斥。收购(3000,时间单位。秒);//获取锁成功,进行业务处理if(锁定标志){ log。信息( { } --获取锁成功,线程名称);//模拟业务处理,时间为3s线程。睡眠(3000);} else { log。信息( { } --获取锁失败,线程名称);} }捕捉(异常e) { log.info({} -获取锁异常,线程名);}最后{ //业务处理完成,释放锁,唤醒比当前线程创建的节点序号大(最靠近)的线程获取锁互斥体。发布();日志。信息( { } --锁发布,线程名称);}返回线程: 线程名称执行完成;}}
00-1010我们用JMeter模拟100个客户端同时访问localhost :8081/test/test lock,相当于100个客户端竞争分布式锁。结果显示在图的右上角。100个请求需要5分6秒,每个线程获得锁后业务处理3秒。100个线程的理想时间是300秒(thread.sleep (3000))。
zookeeper的每个线程在/rooLock节点下创建的临时有序节点如下图所示。因为它们是临时的,所以在线程释放锁之后,这些节点也将被删除。
100线程程序日志打印
关于如何在InterProcessMutex内部实现zookeeper分布式锁,请看我在这里写的这篇文章:
这就是本文关于springboot zookeeper实现分布式锁的示例代码。有关springboot zookeeper分布式锁的更多信息,请搜索以前关于流行IT的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。