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
  • 相关阅读:
    Golang Failpoint 的设计与实现
    没涉及到最值求解;观点:矩阵乘法无法表达出结果。 现实生活中事件、现象的数学表达
    多元微分学 枚举破解15位路由器密码 存储空间限制 拆分减长,求最值 数据去重
    ARP Poisoning Attack and Mitigation Techniques ARP欺骗 中间人攻击 Man-In-The-Middle (MITM) attack 嗅探 防范 Can one MAC address have two different IP addresses within the network?
    The C10K problem
    HTTP Streaming Architecture HLS 直播点播 HTTP流架构
    现代IM系统中消息推送和存储架构的实现
    现代IM系统中的消息系统架构
    长连接锁服务优化实践 C10K问题 nodejs的内部构造 limits.conf文件修改 sysctl.conf文件修改
    doubleclick cookie、动态脚本、用户画像、用户行为分析和海量数据存取 推荐词 京东 电商 信息上传 黑洞 https://blackhole.m.jd.com/getinfo
  • 原文地址:https://www.cnblogs.com/callbin/p/14584809.html
Copyright © 2011-2022 走看看