Spring Boot

springboot项目redis分布式锁实现(基于luttuce)

左心房为你撑大大i 提交于 2021-01-27 11:17:51
问题背景 对于大部分的后端服务,服务很多都是多实例部署的,而在我们的工程中,比如说代码中定义的定时任务需要从数据库中捞数据,那么多机部署上的每个实例都会执行,那么就会存在数据重复上报,那么就不可避免得出现脏数据,影响数据的准确性。 问题分析 解决这个问题最直接的思路就是,当多机部署中无论哪个实例捞到了某条数据,那么其他的实例就不能再次捞取。针对这个思路,我们大致可以有以下两个解决方案: 1. 在数据库层解决。给访问的数据表中,增一个字段flag,标识是否已经上报过,每个实例上报一条,就更新一下这个状态,后面的实例再读到这一条时,发现上报过了,就不处理了。这就要改一下现在的读取方式,需要从数据库中逐条读取,避免脏数据。 2. 引入分布式锁,最简单的,就用redis实现,每个实例开始定时任务前,先尝试在redis中获取锁,如果获取得到,这个实例的定时任务就执行,否则就跳过。 对于第一个解决方案的实现本文不予说明,这种实现方式虽然可行,但是对于频繁更新数据库的操作我个人是非常不推荐的,性能方面可能会受到影响。本文主要想介绍一下方案2的实现。 方案实现 对于多机部署的问题,自然而然就可以想到分布式锁来保证任务执行的准确性。在Springboot项目中,最直接就是通过redis实现,我们知道,从Springboot 2.X开始,底层的redis客户端从Jedis换成了luttuce

Eureka 注册中心看这一篇就够了

谁说我不能喝 提交于 2021-01-27 05:53:09
摘自: https://www.cnblogs.com/mrhelloworld/p/eureka.html  服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串、路由信息等。服务注册中心是微服务架构中最基础的设施之一。   在微服务架构流行之前,注册中心就已经开始出现在分布式架构的系统中。Dubbo 是一个在国内比较流行的分布式框架,被大量的中小型互联网公司所采用,它提供了比较完善的服务治理功能,而服务治理的实现主要依靠的就是注册中心。    什么是注册中心      注册中心可以说是微服务架构中的“通讯录”,它记录了服务和服务地址的映射关系。在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用。   举个现实生活中的例子,比如说,我们手机中的通讯录的两个使用场景: 当我想给张三打电话时,那我需要在通讯录中按照名字找到张三,然后就可以找到他的手机号拨打电话。—— 服务发现 李四办了手机号并把手机号告诉了我,我把李四的号码存进通讯录,后续,我就可以从通讯录找到他。—— 服务注册 通讯录 —— ?什么角色(提示:服务注册中心)   总结:服务注册中心的作用就是 服务的注册 和 服务的发现 。    常见的注册中心    Netflix Eureka Alibaba Nacos

14. es 整合springboot

拟墨画扇 提交于 2021-01-27 05:51:42
参考 https://blog.csdn.net/chen_2890/article/details/83895646 1.目的 通过程序对es 进行增删改查 2. 实现过程 2.1 搭建springboot项目 手动加入lombok 的jar <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> <scope>provided</scope> </dependency> 2.2 增加 配置数据源 : ##本项目端口号 server.port=8888 ##es所在服务器地址 端口9300 spring.data.elasticsearch.cluster-nodes = localhost:9300 2.2.1 实体类 (很重要) 2.2.2 controller层 2.2.3 业务层 2.2.4 持久层 2.2.5 测试 es库中效果 2.3 删除 2.3.1 controller 2.3.2 业务层 2.3.3 测试 结果: 2.4 更新 这个操作与保存操作可以公用一个方法 ,当id 相同 的时候进行修改, 不同 的时候进行新增 2.5 查询 2.5.1 基本查询 2.5.1.1 查询所有 不用任何条件 效果: (1

springboot打包jar到docker镜像找不到resources下文件

落花浮王杯 提交于 2021-01-26 20:31:56
准备上docker容器,项目打包后是一个jar包,然后通过dockerFile打包成镜像,但出现找不到resources下的文件。 为了解决这个问题,试了基本所有的方案,发现还是找不到这个文件, 本地使用 Resource[] resources = resource.getResources("classpath:libs"); 方式获取没问题。 研究后发现,当获取路径的时候,其实是从容器中获取的 ,而不是去jar包里面找,所以,在dockerfile 中加入如下的代码即可。 加了这一段后,会将文件放到容器中根目录 /libs 下面,在这个文件夹下的东西也被复制进去了。 使用的是,直接写项目的根路径即可。 来源: oschina 链接: https://my.oschina.net/sprouting/blog/4925170

推荐一款基于 Java 的身份证号码识别系统

牧云@^-^@ 提交于 2021-01-26 09:41:33
点击▲关注 “ 爪哇妹 ” 给公众号标星置顶 更多摄影技巧 第一时间直达 大家好,我是阿逛! 最近发现一个有趣的项目。 这个 项目是通过学习https://gitee.com/nbsl/idCardCv 后整合 tess4j,不需要经过训练直接使用的,当然,你也可以进行训练后进行使用。 该项目修改原有的需要安装 opencv 的过程,全部使用 javaccp 技术重构,通过 javaccp 引入需要的 c++ 库进行开发。不需要安装 opencv 新增的了前端控制识别区域的功能,新增了后端识别后验证 ,页面样式主要适应 paid,重新修改了后面的识别过程,用户 opencv 进行图片优化和区域 选择,使用 tess4j 进行数字和 x 的识别 配合样式中的区域在后台裁剪相关区域图片 /idCardCv/src/main/resources/static/js/plugins/cropper/cropper.css 身份证号码识别 请求地址 http://localhost:8080/idCard/index 它基于 openCV 开源库。这意味着你可以获取全部源代码,并且移植到 opencv 支持的所有平台。它是基于 java 开发。它的识别率较高。图片清晰情况下,号码检测与识别准确率在90%以上。 Required Software 本版本在以下平台测试通过: windows7

分布式锁与Redis 分布式锁实现

与世无争的帅哥 提交于 2021-01-26 08:31:56
分布式锁 概念 任何一个系统都无法同时满足一致性(Consistency),可用性(Availability),分区容错性(Partition tolerance), 只能同时满足2个; 分布式锁就是为了解决数据一致性问题. 悲观锁和乐观锁 悲观锁: 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次拿数据都会上锁,这样别人想拿这个数据就会阻塞,知道锁被释放 悲观锁多用于多写场景,关系型数据库中很多使用了这种悲观锁机制 实现: redis 实现锁机制 乐观锁 总是假设最好的情况,即每次去拿数据的时候都认为别的线程不会去修改,所以不会上锁,但是在更新数据的时候会判断在此期间有没有其它线程更新了这个数据,可以用版本号机制和CAS算法来实现; 乐观锁多用户多读场景,提高吞吐量,比如数据库提供的write_condition机制 实现: 数据库添加版本号字段: 一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加1。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。 CAS 算法 应用场景 涉及到多个实例进程操作同一份数据时就需要用到锁机制,比如: 下单,修改库存,更新缓存等

spring中那些让你爱不释手的代码技巧(续集)

淺唱寂寞╮ 提交于 2021-01-26 01:22:12
前言 上一篇文章《spring中这些能升华代码的技巧,可能会让你爱不释手》发表之后,受到了不少读者的好评,很多读者都在期待续集。今天非常高兴的通知大家,你们要的续集来了。本文继续总结我认为spring中还不错的知识点,希望对您有所帮助。 一. @Conditional的强大之处 不知道你们有没有遇到过这些问题: 某个功能需要根据项目中有没有某个jar判断是否开启该功能。 某个bean的实例化需要先判断另一个bean有没有实例化,再判断是否实例化自己。 某个功能是否开启,在配置文件中有个参数可以对它进行控制。 如果你有遇到过上述这些问题,那么恭喜你,本节内容非常适合你。 @ConditionalOnClass 问题1可以用@ConditionalOnClass注解解决,代码如下: public class A { } public class B { } @ConditionalOnClass(B.class) @Configuration public class TestConfiguration { @Bean public A a() { return new A(); } } 如果项目中存在B类,则会实例化A类。如果不存在B类,则不会实例化A类。 有人可能会问:不是判断有没有某个jar吗?怎么现在判断某个类了? ❝ 直接判断有没有该jar下的某个关键类更简单。 ❞

一款开源 SpringBoot+Vue 管理系统

荒凉一梦 提交于 2021-01-25 07:41:02
嗨喽 !Java后端编程的各位小伙伴们,由于公众号做了乱序推送改版,为了保证公众号的推文能够第一时间及时送达到大家手上,大家记得将公众号 加星标置顶 ,公众号每天会送上Java技术干货推文 ! 上篇推文: 开源 SpringBoot 商城系统,真香! 刚学习Java的同学,如果想要快速获得项目经验,最好的途径就是学习前辈的开源项目。编程君在大学也是去GitHub上搜索那些关注比较多的Java项目下来研究和学习,慢慢的懂得了一整套的开发所需要掌握的知识点和技能 。所以,后续公众号会慢慢跟大家推荐一些Java开源项目给大家,一起学习成长~ 项目简介 微人事 :这是一款 前后端分离的人力资源管理系统,项目采用 SpringBoot+Vue 开发,项目加入常见的企业级应用所涉及到的技术点,例如 Redis、RabbitMQ 等 。界面虽然不是很好看,但是还是很适合新手学习! 项目框架 后端技术栈 Spring Boot、Spring Security、MyBatis、MySQL、Redis、RabbitMQ、Spring Cache、WebSocket 。 前端技术栈 Vue、ElementUI、axios、vue-router、Vuex、WebSocket、vue-cli4 。 今天给大家介绍的这款Java开源项目,在GitHub已经标星19K了,非常不错。如果大家有兴趣的话

springboot事务

佐手、 提交于 2021-01-25 06:49:21
在SpringBoot则非常简单,只需在业务层添加事务注解( @Transactional )即可快速开启事务。 @Transactional public void addMoney() throws Exception { //先增加余额 accountMapper.addMoney(); //然后遇到故障 throw new RuntimeException("发生异常了.."); } 注意: 常见坑点1:遇到非检测异常时,事务不开启,也无法回滚。 例如下面这段代码,账户余额依旧增加成功,并没有因为后面遇到检测异常而回滚!! @Transactional public void addMoney() throws Exception { //先增加余额 accountMapper.addMoney(); //然后遇到故障 throw new SQLException("发生异常了.."); } 原因分析:因为Spring的默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚。如果想针对非检测异常进行事务回滚,可以在 @Transactional 注解里使用 rollbackFor 属性明确指定异常。例如下面这样,就可以正常回滚: @Transactional(rollbackFor = Exception.class) public