当前位置:   article > 正文

分布式锁2-Zookeeper分布式锁实战

分布式锁2-Zookeeper分布式锁实战

Zookeeper分布式锁实战

使用curator操作Zookeeper进行实战;
curator是什么:Apache Curator包含一套高级API框架和工具类,它 是Apache ZooKeeper 的Java 客户端库。

准备

  1. pom文件引入curtor依赖和zookeeper依赖
<!--curator-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>5.6.0</version>
</dependency>

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>5.6.0</version>
    </dependency>
<!--zookeeper-->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.9.2</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  1. yml配置
#zookeeper
curator:
  connectString: localhost:2181
  retryCount: 5
  elapsedTimeMs: 5000
  sessionTimeOutMs: 60000
  connectionTimeOutMs: 5000
		
	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  1. 配置类
/**
 * @Author 
 * @Date 2024/5/19 19:45
 */
@Data
@Component
@ConfigurationProperties(prefix = "curator")
public class WrapperZK {

    /** 重试次数*/
    private int retryCount;

    /** 重试间隔时间*/
    private int elapsedTimeMs;

    /** 连接地址*/
    private String connectString;

    /** session超时时间*/
    private int sessionTimeOutMs;

    /** 连接超时时间*/
    private int connectionTimeOutMs;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
@Configuration
public class ZookeeperConfig {

    @Autowired
    private WrapperZK wrapperZK;

    @Bean
    public CuratorFramework curatorFramework(){
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(wrapperZK.getElapsedTimeMs(),wrapperZK.getRetryCount());
        CuratorFramework client = CuratorFrameworkFactory.newClient(wrapperZK.getConnectString(), wrapperZK.getSessionTimeOutMs(), wrapperZK.getConnectionTimeOutMs(), retryPolicy);
        client.start();
        return client;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  1. 使用
  @Autowired
    private CuratorFramework curatorFramework;
    static InterProcessLock zkLock;
        /** 使用zookeeper分布式锁 */
    @Transactional
    public void updateByZookeeperLock(Long id,int count){
        if(zkLock == null){
            zkLock = new InterProcessMutex(curatorFramework, "/locks");
        }
        try {
            boolean acquire = zkLock.acquire(10000, TimeUnit.MILLISECONDS);
            /** 加锁*/
            if(acquire){
                Product product = mapper.selectById(id);
                int newCont = product.getProductCount() - count;
                product.setProductCount(newCont);
                if(mapper.updateProduct(product) >0 ){
                    System.out.println("扣减成功!");
                }else {
                    throw new RuntimeException("扣减失败");
                }
            }else {
                System.out.println("拿不到分布式锁!");
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                /** 释放锁*/
                zkLock.release();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
@RestController
@RequestMapping("/product")
public class ProductController {

    @Autowired
    private ProductService service;

    @GetMapping("buy/{id}/{count}")
    public void buy(@PathVariable long id,@PathVariable int count){
        service.updateByZookeeperLock(id,count);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. 测试
    压测前:

在这里插入图片描述
压测:
在这里插入图片描述
压测后:

在这里插入图片描述
成功!

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号