SpringBoot+Curator实现分布式锁

目录

1.添加pom依赖

2.yaml属性配置

3.实现共享锁


1.添加pom依赖

    <properties>
        <java.version>1.8</java.version>
        <lombok.version>1.18.10</lombok.version>
        <zookeeper.version>3.4.5</zookeeper.version>
        <dubbo.version>2.7.8</dubbo.version>
        <curator.version>2.13.0</curator.version>
        <redis.version>3.1.0</redis.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <!-- 排除自带的logback依赖 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>${zookeeper.version}</version>
            <type>pom</type>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${curator.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${curator.version}</version>
        </dependency>
        <!--redis start-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <!-- 排除lettuce包,使用jedis代替-->
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>${redis.version}</version>
        </dependency>
        <!--redis end-->
    </dependencies>

2.yaml属性配置

curator:
  #重试次数
  maxRetries: 3
  #重试间隔时间
  baseSleepTimeMs: 1000
  # zookeeper 地址 多个可用逗号分隔127.0.0.1:2181,127.0.0.1:2182
  connectString: 127.0.0.1:2181 
  # session超时时间
  sessionTimeoutMs: 60000
  # 连接超时时间
  connectionTimeoutMs: 5000
  path: /distributed-lock

3.实现共享锁

加载配置

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
public class CuratorConfig {
    @Value("${curator.maxRetries}")
    private int maxRetries;

    @Value("${curator.baseSleepTimeMs}")
    private int baseSleepTimeMs;

    @Value("${curator.connectString}")
    private String connectString;

    @Value("${curator.sessionTimeoutMs}")
    private int sessionTimeoutMs;

    @Value("${curator.connectionTimeoutMs}")
    private int connectionTimeoutMs;

    @Value("${curator.path}")
    private String path;
}

分布式锁工具 

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.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * 分布式锁工具
 * @since 20210726
 */
@Component
public class DistributedLockUtils {
    @Autowired
    private CuratorConfig curatorConfig;

    @Bean
    public CuratorFramework curatorFramework(){
        //初始休眠时间为 1000ms, 最大重试次数为 3
        RetryPolicy retry = new ExponentialBackoffRetry(curatorConfig.getBaseSleepTimeMs(), curatorConfig.getMaxRetries());

        //Curator 客户端对象
        CuratorFramework client = CuratorFrameworkFactory.newClient(
                curatorConfig.getConnectString(),
                curatorConfig.getSessionTimeoutMs(),
                curatorConfig.getConnectionTimeoutMs(),
                retry);

        client.start();
        return client;
    }
}

应用

import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.locks.InterProcessLock;
import org.apache.curator.framework.recipes.locks.InterProcessSemaphoreMutex;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class DistributedLockServiceImpl {
    @Value("${curator.path}")
    private String basePath;
    @Autowired
    @Qualifier("curatorFramework")
    private CuratorFramework client;

    public void demo(){
        //创建共享锁
        InterProcessLock lock = new InterProcessSemaphoreMutex(client, basePath );
        try {
            lock.acquire();
//            boolean flag = lock.acquire(10000, TimeUnit.MILLISECONDS);

            //TODO
            //添加业务代码
            //dowork();

        } catch (Exception e) {
            log.error("" + e.getMessage(), e);
        } finally {
            try {
                //释放锁
                lock.release();
            } catch (Exception e) {
                log.error("释放分布式锁失败." + e.getMessage(), e);
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值