阿里3个小时手把手教你用zookeeper实现分布式锁( 四 )


文章插图
 
访问流程

阿里3个小时手把手教你用zookeeper实现分布式锁

文章插图
 
**注意**
在使用jmeter测试的时候 需要启动两个服务
  • 在启动第一个之后 去修改pom里面的build里面tomcat插件的端口 8002
  • 记得要刷新pom文件 , 然后再打包启动即可
启动jmeter测试
简单阐述一下:我们会模拟高并发场景下对这个商品的库存进行扣减
这也就会导致一个问题 , 会出现商品超卖(出现负的库存)出现的原因: 在同一时间 , 访问的请求很多 。
下载地址
解压双击jmeter.bat启动
阿里3个小时手把手教你用zookeeper实现分布式锁

文章插图
 
创建线程组
阿里3个小时手把手教你用zookeeper实现分布式锁

文章插图
 
【阿里3个小时手把手教你用zookeeper实现分布式锁】这里的线程数量根据自己电脑去设置
创建请求
阿里3个小时手把手教你用zookeeper实现分布式锁

文章插图
 
我们填写红框的内容即可就是访问的地址
  • 我们还需要查看请求的结果 创建结果树 右击会出现

阿里3个小时手把手教你用zookeeper实现分布式锁

文章插图
 
配置好这些之后 , 点击菜单栏绿色启动标志
  • 会出现弹窗 第一个点yes 第二个点cancel(取消)
去数据库查看
  • 没有启动前数据库的库存
  • 可以看到 出现了 超卖

阿里3个小时手把手教你用zookeeper实现分布式锁

文章插图
 
解决超卖
需要用到 zookeeper集群 , 搭建的文章
zookeeper分布式锁不需要我们手写去实现 , 有封装好的依赖 , 引入即可
xml
<dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.2.0</version> <!-- 网友投票最牛逼版本 --></dependency>在控制层中加入分布式锁的逻辑代码
  • 添加了集群的ip
java
/** * @author : look-word * 2022-07-17 10:12 **/@RestControllerpublic class ProductAction {@Resourceprivate ProductService productService;// 集群ipprivate String connectString = "192.168.77.132,192.168.77.131,192.168.77.130";@GetMapping("product/reduce/{id}")private Object reduce(@PathVariable Integer id) throws Exception {// 重试策略 (1000毫秒试1次 , 最多试3次)RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);//1.创建curator工具对象CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);client.start();//2.根据工具对象创建“内部互斥锁”InterProcessMutex lock = new InterProcessMutex(client, "/product_" + id);try {//3.加锁lock.acquire();productService.reduceStock(id);} catch (Exception e) {if (e instanceof RuntimeException) {throw e;}} finally {//4.释放锁lock.release();}return "ok";}}启动jmeter去测试 , 会发现 , 请求就像排队一样 , 一个一个出现 , 数据库也没有超卖现象
  • 可以看到 只有前面的5课请求成功了 , 我们的库存只有5个
  • 说明我们的分布式锁 , 已经实现了
  •  
springboot版本后续会退出
原文链接:
https://www.cnblogs.com/look-word/p/16488623.html




推荐阅读