跨机器或JVM的分布式锁管理器,用于在分布式环境中协调共享资源

该分布式锁项目已经提交到github上,在github上的地址为:  https://github.com/bingyufight/DistributeLockGenerator



这是一个基于zookeeper和redis上的分布式锁,用于在跨机器或是跨JVM上进行分布式资源的锁管理,确保部署在多台机器或是JVM上的应用程序在同一时刻只能有一台机器或JVM获取分布式锁。 应用场景:1.某些离线定时任务做多机部署。如果不用分布式锁按照原来的方式进行部署,就会遇到在一定的间隔时间内,可能出现多次重复调用的问题。分布式锁保证只有一个机器上离线程序执行. 2.分布式补偿框架和分布式事务中保证全局事务的有序性 3.其他场景:部署在不同机器上的程序需要对共享资源的互斥访问 。。。。。

分布式锁的基本组成模块

zookeeper分布式锁
redis分布式锁   
配置管理
JDK 动态代理 + 注解(实现一个类似于Spring的aop 实现将各个机器分别操作分布式锁的log信息保存进mysql或是mongo)(这个log信息未来可以用来实现优先级抢占式分布式锁)
自定义线程池
mybatis操作mysql  
mongo db操作
Unit test模块

分布式锁的核心接口

public interface IDistributeLock {

boolean acquireLock() throws DistributeLockException;

boolean releaseLock() throws DistributeLockException;

boolean isLocked() throws DistributeLockException;

boolean tryAcquireLock(long duration) throws DistributeLockException;

}

 JDK 动态代理 + 自定义注解 实现aop记录各台机器获取分布式锁的log信息

1 自定义注解

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.METHOD)
public @interface DistributeLockAopTag {
    public Class defaultAopHandleClass();
}

2 jdk 动态代理类

public class DistributeLockAopInvocationHandler implements InvocationHandler {

private static Logger logger = LoggerFactory.getLogger(DistributeLockAopInvocationHandler.class);

private Object proxyTarget;

private AbstractDistributeLockAopEntity proxyDistributeLockAopEntity;

public DistributeLockAopInvocationHandler(Object target,AbstractDistributeLockAopEntity proxyDistributeLockAopEntity){
    proxyTarget = target;
    this.proxyDistributeLockAopEntity = proxyDistributeLockAopEntity;
}

public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable {
      Method originalMethod = proxyTarget.getClass().getMethod(method.getName(), method.getParameterTypes());
      if (!originalMethod.isAnnotationPresent(DistributeLockAopTag.class)) {
          return method.invoke(proxyTarget, args);
      }
      Object result = method.invoke(proxyTarget, args);
      Map<String,Object> params = generateParamsFromTargetObject(originalMethod.getName(),result);
      proxyDistributeLockAopEntity.logDistributeLockInfo(params);
      return result;            
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值