zoukankan      html  css  js  c++  java
  • 基于Zookeeper的curator客户端实现分布式锁

    基于Zookeeper的curator客户端实现分布式锁

    一、进入官网

        http://curator.apache.org

        

    二、引入curator 的jar包

           1、进入 https://mvnrepository.com/  搜索 curator

       

      2.Pom文件引入找到的jar包依赖

         

    <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>4.2.0</version>
            </dependency>

        3、测试程序

         从官网上拷贝 RetryPolicy 和 Distributed Lock 代码块

       

    package com.example.distributezklock;
    
    import com.example.distributezklock.lock.ZkLock;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.curator.RetryPolicy;
    import org.apache.curator.framework.CuratorFramework;
    import org.apache.curator.framework.CuratorFrameworkFactory;
    import org.apache.curator.framework.recipes.locks.InterProcessMutex;
    import org.apache.curator.retry.ExponentialBackoffRetry;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    @Slf4j
    public class DistributeZkLockApplicationTests {
    
        @Test
        public void contextLoads() {
        }
    
    
        @Test
        public void testZkLock() throws Exception {
            ZkLock zkLock = new ZkLock();
            boolean lock = zkLock.getLock("order");
            log.info("获得锁的结果:"+lock);
    
            zkLock.close();
        }
    
        @Test
        public void testCuratorLock(){
            RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
            CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
            client.start();
            InterProcessMutex lock = new InterProcessMutex(client, "/order");
            try {
                if ( lock.acquire(30, TimeUnit.SECONDS) ) {
                    try  {
                        log.info("我获得了锁!!!");
                    }
                    finally  {
                        lock.release();
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            client.close();
        }
    }
    View Code

    4、把代码完善,把curator客户端,定义为Bean ,包括初始化和释放

     

    package com.example.distributezklock;
    
    import org.apache.curator.RetryPolicy;
    import org.apache.curator.framework.CuratorFramework;
    import org.apache.curator.framework.CuratorFrameworkFactory;
    import org.apache.curator.retry.ExponentialBackoffRetry;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    
    @SpringBootApplication
    public class DistributeZkLockApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DistributeZkLockApplication.class, args);
        }
    
        @Bean(initMethod="start",destroyMethod = "close")
        public CuratorFramework getCuratorFramework() {
            RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
            CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", retryPolicy);
            return client;
        }
    }
    View Code

     5、controller 层测试

       

    package com.example.distributezklock.controller;
    
    import com.example.distributezklock.lock.ZkLock;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.curator.framework.CuratorFramework;
    import org.apache.curator.framework.recipes.locks.InterProcessMutex;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    
    @RestController
    @Slf4j
    public class ZookeeperController {
        @Autowired
        private CuratorFramework client;
    
      
    
        @RequestMapping("curatorLock")
        public String curatorLock(){
            log.info("我进入了方法!");
            InterProcessMutex lock = new InterProcessMutex(client, "/order");
            try{
                if (lock.acquire(30, TimeUnit.SECONDS)){
                    log.info("我获得了锁!!");
                    Thread.sleep(10000);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                try {
                    log.info("我释放了锁!!");
                    lock.release();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            log.info("方法执行完成!");
            return "方法执行完成!";
        }
    }
    View Code
  • 相关阅读:
    jmeter的开启
    RobotFramework Selenium2 关键字
    RobotFramework测试环境搭建记录
    Posture Energy——姿态的能量
    在Centos中安装HustOJ实验记录
    江苏省综合素质评价平台视频操作演示和各角色说明书下载
    设计模式实战研磨 ——第1篇 UML环境搭建
    精益创新之设计思维研磨——《设计改变一切》书评
    Centos7中给gitLab汉化
    Centos7下安装gitLab
  • 原文地址:https://www.cnblogs.com/callbin/p/14584809.html
Copyright © 2011-2022 走看看