zklock-spring-boot-autoconfigure


License

License

Categories

Categories

Spring Boot Container Microservices Auto Application Layer Libs Code Generators config Configuration
GroupId

GroupId

com.github.dawn9117
ArtifactId

ArtifactId

zklock-spring-boot-autoconfigure
Last Version

Last Version

1.0.8
Release Date

Release Date

Type

Type

jar
Description

Description

zklock-spring-boot-autoconfigure
zklock-spring-boot-autoconfigure
Project URL

Project URL

https://projects.spring.io/spring-boot/#/spring-boot-starter-parent/zklock-spring-boot-autoconfigure

Download zklock-spring-boot-autoconfigure

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.dawn9117/zklock-spring-boot-autoconfigure/ -->
<dependency>
    <groupId>com.github.dawn9117</groupId>
    <artifactId>zklock-spring-boot-autoconfigure</artifactId>
    <version>1.0.8</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.dawn9117/zklock-spring-boot-autoconfigure/
implementation 'com.github.dawn9117:zklock-spring-boot-autoconfigure:1.0.8'
// https://jarcasting.com/artifacts/com.github.dawn9117/zklock-spring-boot-autoconfigure/
implementation ("com.github.dawn9117:zklock-spring-boot-autoconfigure:1.0.8")
'com.github.dawn9117:zklock-spring-boot-autoconfigure:jar:1.0.8'
<dependency org="com.github.dawn9117" name="zklock-spring-boot-autoconfigure" rev="1.0.8">
  <artifact name="zklock-spring-boot-autoconfigure" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.dawn9117', module='zklock-spring-boot-autoconfigure', version='1.0.8')
)
libraryDependencies += "com.github.dawn9117" % "zklock-spring-boot-autoconfigure" % "1.0.8"
[com.github.dawn9117/zklock-spring-boot-autoconfigure "1.0.8"]

Dependencies

compile (8)

Group / Artifact Type Version
org.springframework.boot : spring-boot-autoconfigure jar 2.2.1.RELEASE
org.springframework.boot : spring-boot-starter-aop jar 2.2.1.RELEASE
org.springframework.boot : spring-boot-configuration-processor Optional jar 2.2.1.RELEASE
org.projectlombok : lombok Optional jar 1.18.10
org.apache.curator : curator-recipes jar 2.8.0
org.apache.commons : commons-collections4 jar 4.3
org.apache.commons : commons-lang3 jar 3.9
com.alibaba : fastjson jar 1.2.62

Project Modules

There are no modules declared in this project.

zookeeper分布式锁starter

特别提示:

ZK客户端连接超时时间和@ZkLock的timeout受限于zookeeper(zkServer)服务端使用的配置属性, 请根据实际需求修改zk服务端启动配置:

参考zoo.cfg配置项:
  • minSessionTimeout: 最小的session time时间,默认值是2个tick time,客户端设置的session time 如果小于这个值,则会被强制协调为这个最小值
  • maxSessionTimeout: 最大的session time时间,默认值是20个tick time,客户端设置的session time 如果大于这个值,则会被强制协调为这个最大值

简介

该项目主要利用Spring Boot的自动化配置特性来实现快速的将zookeeper分布式锁引入spring boot应用,简化原生使用curator的整合代码。

源码地址

GitHub:https://github.com/dawn9117/zklock-spring-boot-starter

小工具一枚,欢迎使用和Star支持,如使用过程中碰到问题,可以提出Issue,我会尽力完善该Starter

版本基础

  • spring-boot-starter-parent: 2.1.9.RELEASE
  • curator-recipes:2.8.0
  • fastjson: 1.2.62
  • commons-collections4: 4.3
  • commons.lang3: 3.9

如何使用

在该项目的帮助下,我们的Spring Boot可以轻松的引入zk分布式锁,主需要做下面两个步骤:

step1. 在pom.xml中引入依赖:

<dependency>
  <groupId>com.github.dawn9117</groupId>
  <artifactId>zklock-spring-boot-starter</artifactId>
  <version>${version}</version>
</dependency>

step2. 在application.properties中添加以下配置

  • zklock.enabled=true, (zklock开关 默认true)
  • zklock.zk.registry-address=XXX:2181, (zk地址: required)
  • zklock.zk.lock-namespace=XXX, (zk锁根路径: optional, 默认: locks)
  • zklock.zk.session-timeout=XXX, (session超时时间: optional, 默认: 30000)
  • zklock.zk.connect-timeout=XXX, (connect超时时间: optional, 默认: 30000)

如果配置文件中已经有zookeeper的配置,但是key不适用于该插件的话, 也可以使用以下方式配置:

@Configuration
public class AppConfig {
	@Value("${XXX}")
	private String zkAddress;

	@Bean
	public LockConfig lockConfig (){
		LockConfig config = new LockConfig();
		ZkConfig zkConfig = new ZkConfig();
		zkConfig.setRegistryAddress(zkAddress);
		config.setZk(zkConfig);
		return config;
	}
}

step3. 在需要加分布式锁的方法上增加@ZkLock注解

@ZkLock
public Object test(){
    return "zklock test";
}

锁说明: 默认使用不可重入共享锁, 规则如下:

  • 未指定Path: zk.lock-namespace + 类全路径 + 方法名, 例如 @ZkLock: /locks/com.github.dawn.UserService/add
  • 指定path: zk.lock-namespace + path, 例如 @ZkLock("/1000"): /locks/1000
  • SPEL: zk.lock-namespace + 类全路径 + 方法名 + SPEL, 例如 @ZkLock("#param1"): /locks/com.github.dawn.UserService/add/解析#param1得到的值
原理: 使用spring aop对添加@ZkLock注解的方法进行环绕处理, 处理逻辑:
  • step1.加锁
    • 成功执行下一步
    • 加锁失败, 失败补偿
  • step2. 执行方法
    • 加锁失败并且执行失败补偿返回false则直接抛出异常
    • 加锁成功执行连接的方法
  • step3. 释放锁

@ZkLock更细致的配置内容参考如下:

  • path: 自定义锁路径
  • type: 指定锁类型, 可自己拓展(目前支持可重入共享锁, 不可重入共享锁)
  • retry: 配合RetryLockCompensator使用, 失败重试次数
  • failedCompensator: 加锁失败补偿器, 可自定义, 实现LockFailedCompensator接口
  • timeout: 锁连接超时时长
  • timeuint: 锁连接超时时间单位

Versions

Version
1.0.8
1.0.7
1.0.6
1.0.5
1.0.3
1.0.1
1.0.0.RELEASE