分布式锁实现

需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台源码:壹零叁八柒柒肆六二六

基于Consul的分布式锁主要利用Key/Value存储API中的acquire和release操作来实现。acquire和release操作是类似Check-And-Set的操作:

acquire操作只有当锁不存在持有者时才会返回true,并且set设置的Value值,同时执行操作的session会持有对该Key的锁,否则就返回false release操作则是使用指定的session来释放某个Key的锁,如果指定的session无效,那么会返回false,否则就会set设置Value值,并返回true

基本流程

具体实现

public class Lock {private static final String prefix = "lock/";  // 同步锁参数前缀private ConsulClient consulClient;private String sessionName;private String sessionId = null;private String lockKey;/**** @param consulClient* @param sessionName   同步锁的session名称* @param lockKey       同步锁在consul的KV存储中的Key路径,会自动增加prefix前缀,方便归类查询*/public Lock(ConsulClient consulClient, String sessionName, String lockKey) {this.consulClient = consulClient;this.sessionName = sessionName;this.lockKey = prefix + lockKey;}/*** 获取同步锁** @param block     是否阻塞,直到获取到锁为止* @return*/public Boolean lock(boolean block) {if (sessionId != null) {throw new RuntimeException(sessionId + " - Already locked!");}sessionId = createSession(sessionName);while(true) {PutParams putParams = new PutParams();putParams.setAcquireSession(sessionId);if(consulClient.setKVValue(lockKey, "lock:" + LocalDateTime.now(), putParams).getValue()) {return true;} else if(block) {continue;} else {return false;}}}/*** 释放同步锁** @return*/public Boolean unlock() {PutParams putParams = new PutParams();putParams.setReleaseSession(sessionId);boolean result = consulClient.setKVValue(lockKey, "unlock:" + LocalDateTime.now(), putParams).getValue();consulClient.sessionDestroy(sessionId, null);return result;}/*** 创建session* @param sessionName* @return*/private String createSession(String sessionName) {NewSession newSession = new NewSession();newSession.setName(sessionName);return consulClient.sessionCreate(newSession, null).getValue();}}
复制代码

单元测试 下面单元测试的逻辑:通过线程的方式来模拟不同的分布式服务来竞争锁。多个处理线程同时以阻塞方式来申请分布式锁,当处理线程获得锁之后,Sleep一段随机事件,以模拟处理业务逻辑,处理完毕之后释放锁。

public class TestLock {private Logger logger = Logger.getLogger(getClass());@Testpublic void testLock() throws Exception  {new Thread(new LockRunner(1)).start();new Thread(new LockRunner(2)).start();new Thread(new LockRunner(3)).start();new Thread(new LockRunner(4)).start();new Thread(new LockRunner(5)).start();Thread.sleep(200000L);}class LockRunner implements Runnable {private Logger logger = Logger.getLogger(getClass());private int flag;public LockRunner(int flag) {this.flag = flag;}@Overridepublic void run() {Lock lock = new Lock(new ConsulClient(), "lock-session", "lock-key");try {if (lock.lock(true)) {logger.info("Thread " + flag + " start!");Thread.sleep(new Random().nextInt(3000L));logger.info("Thread " + flag + " end!");}} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}}}
复制代码

单元测试执行结果如下:

2017-04-12 21:28:09,698 INFO  [Thread-0] LockRunner - Thread 1 start!
2017-04-12 21:28:12,717 INFO  [Thread-0] LockRunner - Thread 1 end!
2017-04-12 21:28:13,219 INFO  [Thread-2] LockRunner - Thread 3 start!
2017-04-12 21:28:15,672 INFO  [Thread-2] LockRunner - Thread 3 end!
2017-04-12 21:28:15,735 INFO  [Thread-1] LockRunner - Thread 2 start!
2017-04-12 21:28:17,788 INFO  [Thread-1] LockRunner - Thread 2 end!
2017-04-12 21:28:18,249 INFO  [Thread-4] LockRunner - Thread 5 start!
2017-04-12 21:28:19,573 INFO  [Thread-4] LockRunner - Thread 5 end!
2017-04-12 21:28:19,757 INFO  [Thread-3] LockRunner - Thread 4 start!
2017-04-12 21:28:21,353 INFO  [Thread-3] LockRunner - Thread 4 end!
复制代码

从测试结果我们可以看到,通过分布式锁的形式来控制并发时,多个同步操作只会有一个操作能够被执行,其他操作只有在等锁释放之后才有机会去执行,所以通过这样的分布式锁,我们可以控制共享资源同时只能被一个操作进行执行,以保障数据处理时的分布式并发问题。

java B2B2C 源码 多级分销springmvc mybatis多租户电子商城系统

转载于:https://juejin.im/post/5c257c2e6fb9a049b13e446a

java B2B2C源码电子商务平台-基于Consul的分布式锁实现相关推荐

  1. java B2B2C源码电子商务平台 - Zuul回退机制

    1.在一些不稳定因素导致路由后面的微服务宕机或者无响应时,zuul 就会累计大量的请求,久而久之基本上所有的请求都会超时,但是请求链接数却不断的在增加,不断的占用资源池不能结束知道超时消耗殆尽导致zu ...

  2. java B2B2C源码电子商务平台 -SpringCloud配置中心高可用搭建

    本文通过config server连接git仓库来实现配置中心,除了git还可以使用svn或者系统本地目录都行.需要JAVA Spring Cloud大型企业分布式微服务云构建的B2B2C电子商务平台 ...

  3. java B2B2C源码电子商务平台-配置中心svn示例和refresh

    国内很多公司都使用的svn来做代码的版本控制,我们先介绍以下如何使用svn+Spring Cloud Config来做配置中心.需要了解电子商务平台源码可加企鹅邱邱 一零三八七七四六二六 svn版本 ...

  4. java B2B2C源码电子商务平台 -commonservice-config配置服务搭建

    2019独角兽企业重金招聘Python工程师标准>>> Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持.使用Config Server,您可以在 ...

  5. java B2B2C源码电子商务平台 --zuul跨域访问问题

    springcloud微服务框架,是一组组件,eureka服务注册中心,zuul路由等等 一般都是在zuul上配好url路径映射到各个服务,所以对外都是访问zuul服务的端口,但是在web服务设置了跨 ...

  6. java B2B2C源码电子商务平台 -SpringCloud服务相互调用RestTemplate

    Springcloud中的服务消费,就需要我们服务之前相互发请求了.之前我们都是想着用http请求相关的交互,用的比较多的是apache httpcomponents ,现在springboot提供了 ...

  7. java B2B2C源码电子商务平台

    springCloud是基于SpringBoot的一整套实现微服务的框架.他提供了微服务开发所需的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管理等组 ...

  8. java B2B2C源码电子商务平台 ---搭建Eureka注册中心

    一 创建一个Spring Boot工程,命名为eureka-server,并在pom.xml中引入必要的依赖,代码如下.愿意了解源码的朋友直接求求交流分享技术:二一四七七七五六三三 <paren ...

  9. b2b2c源码 java_java B2B2C源码电子商务平台

    鸿鹄云商大型企业分布式互联网电子商务平台,推出PC+微信+APP+云服务的云商平台系统,其中包括B2B.B2C.C2C.O2O.新零售.直播电商等子平台.愿意了解源码的朋友直接求求交流分享技术:二一四 ...

最新文章

  1. 最落寞的C9高校:从未没落
  2. Oracle再发力,区块链平台多项更新
  3. win7下wifi密码的保存路径
  4. 集成Tomcat环境到Eclipse中
  5. 孩子们的游戏(圆圈中最后剩下的数)
  6. 接口说明_接口说明_实时语音识别_智能语音交互-阿里云
  7. enclosing type java_Java ResolvedJavaType.getEnclosingType方法代码示例
  8. python科学计算之Pandas使用(三)
  9. MTK平台调试加密芯片ATSHA204A
  10. RayTracing练习
  11. 推荐几个偷网站的小工具
  12. 华为路由器NAT经典配置
  13. Number.EPSILON
  14. 小米手环4怎么使用_小米运动手环4使用说明
  15. python计算运动会某个参赛选手的得分。数据保存在文件中_为什么一定要考计算机二级证书?8个好处,考和没考区别有点大...
  16. 如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析
  17. 诸葛io+DeepShare技术 轻松掌握渠道效果监测
  18. 电脑计算机u盘启动不了桌面,开机进不了桌面怎么办?教你5招这样解决
  19. 真正想做的人,什么都不说
  20. 「镁客·请讲」YOYOW白菜:区块链泡沫是个好东西,希望持续两三年

热门文章

  1. [Contest20170910]string
  2. Cocos2d-x开发---关于安卓打包所遇到的错误记录
  3. c的开始,求最大数。
  4. 深入理解JavaScript系列(2):揭秘命名函数表达式(转)
  5. Ubuntu14.04下安装eclipse
  6. Linux shell编程(四)流程控制
  7. rman备份中的%参数详解
  8. 网站漏洞扫描工具Uniscan
  9. 网站robots.txt探测工具Parsero
  10. iOS10 UI教程子视图和父视图UI层次结构和Views继承