在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:Aquarius开源软件地址:https://gitee.com/nepxion/Aquarius开源软件介绍:Nepxion AquariusNepxion Aquarius是一款基于Redis + Zookeeper的分布式应用组件集合,包含分布式锁,缓存,ID生成器,限速限流器。它采用Nepxion Matrix AOP框架进行切面架构,提供注解调用方式,也提供API调用方式 简介
兼容
依赖分布式锁<dependency> <groupId>com.nepxion</groupId> <artifactId>aquarius-lock-starter</artifactId> <version>${aquarius.version}</version></dependency>分布式缓存<dependency> <groupId>com.nepxion</groupId> <artifactId>aquarius-cache-starter</artifactId> <version>${aquarius.version}</version></dependency>分布式全局唯一ID<dependency> <groupId>com.nepxion</groupId> <artifactId>aquarius-id-generator-starter</artifactId> <version>${aquarius.version}</version></dependency>分布式限速限流<dependency> <groupId>com.nepxion</groupId> <artifactId>aquarius-limit-starter</artifactId> <version>${aquarius.version}</version></dependency> Nepxion Aquarius Lock基于Redisson(Redis)、Curator(Zookeeper)分布式锁和本地锁,构建于Nepxion Matrix AOP framework,你可以在这三个锁组件中选择一个移植入你的应用中 提示
介绍
示例使用分布式锁示例如下,更多细节见aquarius-spring-boot-example工程下com.nepxion.aquarius.example.lock 普通分布式锁的使用 注解方式 package com.nepxion.aquarius.example.lock.service;/** * <p>Title: Nepxion Aquarius</p> * <p>Description: Nepxion Aquarius</p> * <p>Copyright: Copyright (c) 2017-2050</p> * <p>Company: Nepxion</p> * @author Haojun Ren * @version 1.0 */import com.nepxion.aquarius.lock.annotation.Lock;public interface MyService1 { @Lock(name = "lock", key = "#id1 + \"-\" + #id2", leaseTime = 5000L, waitTime = 60000L, async = false, fair = false) String doA(String id1, String id2); String doB(String id1, String id2);} package com.nepxion.aquarius.example.lock.service;/** * <p>Title: Nepxion Aquarius</p> * <p>Description: Nepxion Aquarius</p> * <p>Copyright: Copyright (c) 2017-2050</p> * <p>Company: Nepxion</p> * @author Haojun Ren * @version 1.0 */import java.util.concurrent.TimeUnit;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import com.nepxion.aquarius.lock.annotation.Lock;@Service("myService2Impl")public class MyService2Impl { private static final Logger LOG = LoggerFactory.getLogger(MyService2Impl.class); @Lock(name = "lock", key = "#id1 + \"-\" + #id2", leaseTime = 5000L, waitTime = 60000L, async = false, fair = false) public String doC(String id1, String id2) { try { TimeUnit.MILLISECONDS.sleep(2000L); } catch (InterruptedException e) { e.printStackTrace(); } LOG.info("doC - lock is got"); return "C"; } public String doD(String id1, String id2) { LOG.info("doD"); return "D"; }} package com.nepxion.aquarius.example.lock.app1;/** * <p>Title: Nepxion Aquarius</p> * <p>Description: Nepxion Aquarius</p> * <p>Copyright: Copyright (c) 2017-2050</p> * <p>Company: Nepxion</p> * @author Haojun Ren * @version 1.0 */import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import com.nepxion.aquarius.example.lock.service.MyService1;import com.nepxion.aquarius.example.lock.service.MyService2Impl;import com.nepxion.aquarius.lock.annotation.EnableLock;@SpringBootApplication@EnableLock@ComponentScan(basePackages = { "com.nepxion.aquarius.example.lock.service" })public class LockAopApplication { public static void main(String[] args) throws Exception { ConfigurableApplicationContext applicationContext = SpringApplication.run(LockAopApplication.class, args); // 执行效果是doA和doC无序打印,即谁拿到锁谁先运行 MyService1 myService1 = applicationContext.getBean(MyService1.class); for (int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { myService1.doA("X", "Y"); } }).start(); } MyService2Impl myService2 = applicationContext.getBean(MyService2Impl.class); for (int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { myService2.doC("X", "Y"); } }).start(); } } @Bean public EmbeddedServletContainerFactory createEmbeddedServletContainerFactory() { TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory(); tomcatFactory.setPort(8087); return tomcatFactory; }} 直接调用方式 package com.nepxion.aquarius.example.lock.app2;/** * <p>Title: Nepxion Aquarius</p> * <p>Description: Nepxion Aquarius</p> * <p>Copyright: Copyright (c) 2017-2050</p> * <p>Company: Nepxion</p> * @author Haojun Ren * @version 1.0 */import java.util.concurrent.TimeUnit;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import com.nepxion.aquarius.lock.LockExecutor;import com.nepxion.aquarius.lock.annotation.EnableLock;import com.nepxion.aquarius.lock.entity.LockType;@SpringBootApplication@EnableLock@ComponentScan(basePackages = { "com.nepxion.aquarius.example.lock.service" })public class LockApplication { private static final Logger LOG = LoggerFactory.getLogger(LockApplication.class); @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { ConfigurableApplicationContext applicationContext = SpringApplication.run(LockApplication.class, args); LockExecutor<Object> lockExecutor = applicationContext.getBean(LockExecutor.class); for (int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { Object lock = null; try { lock = lockExecutor.tryLock(LockType.LOCK, "lock", "X-Y", 5000L, 60000L, false, false); if (lock != null) { try { TimeUnit.MILLISECONDS.sleep(2000L); } catch (InterruptedException e) { e.printStackTrace(); } LOG.info("doA - lock is got"); } } catch (Exception e) { e.printStackTrace(); } finally { try { lockExecutor.unlock(lock); } catch (Exception e) { e.printStackTrace(); } } } }).start(); } for (int i = 0; i < 5; i++) { new Thread(new Runnable() { @Override public void run() { Object lock = null; try { lock = lockExecutor.tryLock(LockType.LOCK, "lock", "X-Y", 5000L, 60000L, false, false); if (lock != null) { try { TimeUnit.MILLISECONDS.sleep(2000L); } catch (InterruptedException e) { e.printStackTrace(); } LOG.info("doC - lock is got"); } } catch (Exception e) { e.printStackTrace(); } finally { try { lockExecutor.unlock(lock); } catch (Exception e) { e.printStackTrace(); } } } }).start(); } } @Bean public EmbeddedServletContainerFactory createEmbeddedServletContainerFactory() { TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory(); tomcatFactory.setPort(8088); return tomcatFactory; }} 读/写分布式锁的使用 注解方式 package com.nepxion.aquarius.example.lock.service;/** * <p>Title: Nepxion Aquarius</p> * <p>Description: Nepxion Aquarius</p> * <p>Copyright: Copyright (c) 2017-2050</p> * <p>Company: Nepxion</p> * @author Haojun Ren * @version 1.0 */import com.nepxion.aquarius.lock.annotation.ReadLock;public interface MyService3 { @ReadLock(name = "lock", key = "#id1 + \"-\" + #id2", leaseTime = 5000L, waitTime = 60000L, async = false, fair = false) String doR(String id1, String id2);} package com.nepxion.aquarius.example.lock.service;/** * <p>Title: Nepxion Aquarius</p> * <p>Description: Nepxion Aquarius</p> * <p>Copyright: Copyright (c) 2017-2050</p> * <p>Company: Nepxion</p> * @author Haojun Ren * @version 1.0 */import java.util.concurrent.TimeUnit;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import com.nepxion.aquarius.lock.annotation.WriteLock;@Service("myService4Impl")public class MyService4Impl { private static final Logger LOG = LoggerFactory.getLogger(MyService4Impl.class); @WriteLock(name = "lock", key = "#id1 + \"-\" + #id2", leaseTime = 15000L, waitTime = 60000L, async = false, fair = false) public String doW(String id1, String id2) { try { TimeUnit.MILLISECONDS.sleep(10000L); } catch (InterruptedException e) { e.printStackTrace(); } LOG.info("doW - write lock is got"); return "W"; }} package com.nepxion.aquarius.example.lock.app3;/** * <p>Title: Nepxion Aquarius</p> * <p>Description: Nepxion Aquarius</p> * <p>Copyright: Copyright (c) 2017-2050</p> * <p>Company: Nepxion</p> * @author Haojun Ren * @version 1.0 */import java.util.Timer;import java.util.TimerTask;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import com.nepxion.aquarius.example.lock.service.MyService3;import com.nepxion.aquarius.example.lock.service.MyService4Impl;import com.nepxion.aquarius.lock.annotation.EnableLock;@SpringBootApplication@EnableLock@ComponentScan(basePackages = { "com.nepxion.aquarius.example.lock.service" })public class ReadWriteLockAopApplication { private static final Logger LOG = LoggerFactory.getLogger(ReadWriteLockAopApplication.class); public static void main(String[] args) throws Exception { ConfigurableApplicationContext applicationContext = SpringApplication.run(ReadWriteLockAopApplication.class, args); // 执行效果是先打印doW,即拿到写锁,再打印若干个doR,即可以同时拿到若干个读锁 MyService4Impl myService4 = applicationContext.getBean(MyService4Impl.class); Timer timer1 = new Timer(); timer1.scheduleAtFixedRate(new TimerTask() { public void run() { LOG.info("Start to get write lock..."); // 写锁逻辑,最高持锁15秒,睡眠10秒,10秒后释放读锁 myService4.doW("X", "Y"); } }, 0L, 600000L); MyService3 myService3 = applicationContext.getBean(MyService3.class); Timer timer2 = new Timer(); timer2.scheduleAtFixedRate(new TimerTask() { public void run() { LOG.info("Start to get read lock..."); for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { // 读锁逻辑,最高持锁5秒,睡眠2秒,2秒后释放读锁 myService3
|
请发表评论