
SpringBoot
文章平均质量分 82
SpringBoot
懒虫虫~
无论人生上到哪一层台阶,阶下有人在仰望你,阶上亦有人在俯视你。你抬头自卑,低头自得,唯有平视,才能看见真实的自己!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
基于SpringBoot利用死信队列解决RabbitMQ业务队列故障重试无效场景问题
Slf4j// 声明业务交换机@Bean// 声明死信交换机@Bean// 声明业务队列@Bean// 设置业务队列的死信交换机// 声明死信队列@Bean// 将业务队列绑定到业务交换机@Bean// 将死信队列绑定到死信交换机@Bean。原创 2025-06-08 18:10:24 · 1087 阅读 · 0 评论 -
基于SpringBoot解决RabbitMQ消息丢失问题
RabbitMQ提供了消息确认机制,即生产者在发送消息后,可以等待RabbitMQ服务器返回确认信息,以确保消息已经被正确地接收和处理。在发布消息时,可以设置消息的持久化标志,这样消息就会被写入磁盘中,而不是仅仅保存在内存中。可以通过设置重试次数和重试时间间隔来控制消息重试的行为。综上所述,RabbitMQ通过持久化、确认、事务和重试等机制来保证消息的可靠性,从而解决消息丢失的问题。可以看到由于接口中第1,4,5条消息会正常发送,所以在consumer已经进行了正常消费,并且针对第5条进行了业务重试。原创 2025-06-07 09:00:08 · 712 阅读 · 0 评论 -
基于SpringBoot+Redis实现RabbitMQ幂等性设计,解决MQ重复消费问题
配置死信交换机和死信队列,对于那些重复投递依然无法正确处理的消息,可以转移到死信队列,并设置相应的重试策略及最大重试次数,超过限制则记录日志、报警或手动介入处理。如果在执行消费的过程中,出错了(抛出Exception),则记录消费失败的状态,MQ会再次尝试去进行消费。这里是为了避免在消息开始消费后,RabbitMq宕机了,此时MQ并不知道这个消息最终有没有消费完成,因此重启MQ之后,MQ会重新消费这条消息。可以看到消费者服务,消费完第2个消息后,由于RabbitMQ宕机,本地服务报错,无法消费第3个消息。原创 2025-06-01 17:48:03 · 1969 阅读 · 1 评论 -
SpringBoot中接口签名防止接口重放
*** 获取请求体的字节数组* @return 请求体的字节数组*///参数字节数组,用于存储请求体的字节数据@Getter//Http请求对象/*** 构造函数,初始化包装类* @param request 原始HttpServletRequest对象* @throws IOException 如果读取请求体时发生IO错误*//*** 重写getInputStream方法,实现请求体的重复读取。原创 2025-05-04 16:18:18 · 1276 阅读 · 0 评论 -
SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句
最近做一个需求,关于SQL高可用优化,需要优化项目中的SQL,提升查询效率。原创 2024-09-28 00:52:22 · 687 阅读 · 0 评论 -
分页查询结果并将结果分批保存,防止内存溢出
通过分页查询数据,然后再将分页查询的结果批量进行保存,防止一次性查询数据过大,导致内存溢出。原创 2024-09-09 23:57:22 · 430 阅读 · 0 评论 -
接口如何处理重复请求(接口防刷)?
重复请求常用的处理方式就是幂等性处理,幂等性可以理解为:无论执行了多少次重复请求,数据只会处理一次,在数据库里也只会有一条数据。和数据库的唯一索引是一样的。方式一:前端ajax处理优点:前端可在用户点击之后将按钮锁定,不可点击,直到后端返回数据才释放锁。前端处理是最为简单有效,且对用户比较友好的方式。可用提示语提醒用户等待。缺点:无法应对直接刷后端接口的情况,如果用户直接调后端接口,无法处理(属于特殊情况)。方式:ajax防止重复提交这里我用登录页面功能作为例子讲解,按下面的方法,用户在点击登录后原创 2021-08-03 22:13:32 · 5346 阅读 · 0 评论 -
【高可用】利用AOP实现数据库读写分离
*** 动态数据源*//*** ThreadLocal 用于提供线程局部变量,在多线程环境可以保证各个线程里的变量独立于其它线程里的变量。* 也就是说 ThreadLocal 可以为每个线程创建一个【单独的变量副本】,相当于线程的 private static 类型变量。*//*** 决定使用哪个数据源之前需要把多个数据源的信息以及默认数据源信息配置好* @param targetDataSources 目标数据源。原创 2024-07-23 22:49:58 · 486 阅读 · 0 评论 -
【Sharding-Sphere 整合SpringBoot】
Sharding-Sphere 整合SpringBoot原创 2024-01-07 23:42:37 · 1851 阅读 · 0 评论 -
巧用@Conditional注解根据配置文件注入不同的bean对象
项目中使用了mq,kafka两种消息队列进行发送数据,为了避免硬编码,在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案,仅供参考!原创 2023-09-28 09:23:53 · 1078 阅读 · 0 评论 -
【@PostConstruct、 @Autowired与构造函数的执行顺序】
Java提供的注解,被用来修饰方法,被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。调用的顺序为: 构造函数 > @Autowired > @PostConstruct(2)作用:@PostConstruct注解的方法在项目启动的时候执行这个方法,也可以理解为在spring容器启动的时候执行,可作为一些数据的常规化加载,比如读取数据字典之类、目录树缓存。原创 2023-09-23 19:47:03 · 3175 阅读 · 0 评论 -
利用hutool工具类实现验证码功能
利用hutool工具类,可以很方便生成不同类型的验证码。原创 2023-09-16 16:00:29 · 4956 阅读 · 2 评论 -
利用Semaphore实现多线程调用接口A且限制接口A的每秒QPS为10
前段时间在群里面发现有个群友抛出一个实际需求:需要通过一个接口拉取数据,这个接口有每秒10QPS限制,请问如何实现数据拉去效率最大化且限制调用拉取接口每秒10PQPS?我觉得这个需求挺有意思的,跟某群友讨论,发现可以利用JUC包下的Semaphore实现,几行代码就能搞定。这里将实现方案做下整理,算是抛砖引玉吧~原创 2023-09-13 22:55:25 · 553 阅读 · 0 评论 -
Spring的重试机制-SpringRetry
在我们的日常开发中,经查会遇到调用接口失败的情况,这时候就需要通过一些方法来进行重试,比如通过while循环手动重复调用或,或者通过记录错误接口url和参数到数据库,然后手动调用接口,或者通过JDK/CGLib动态代理的方式来进行重试,但是这种方法比较笨重,且对原有逻辑代码的入侵性比较大。原创 2023-09-03 10:05:53 · 655 阅读 · 0 评论 -
多线程事务怎么回滚?
在Spring中可以使用@Transactional注解去控制事务,使出现异常时会进行回滚,在多线程中,这个注解则不会生效。如果主线程需要先执行一些修改数据库的操作,当子线程在进行处理出现异常时,主线程修改的数据则不会回滚,导致数据错误。通过使用sqlSession控制手动提交事务,可以达到主线程和子线程数据事务回滚。原创 2023-08-13 17:54:49 · 932 阅读 · 1 评论 -
自定义starter实现接口或方法限流功能
*** 基于guava的令牌桶/*** 基于sentinel限流//设置受保护的资源 rule . setResource(resourceName);//设置流控规则 QPS rule . setGrade(RuleConstant . FLOW_GRADE_QPS);//设置受保护的资源阈值 rule . setCount(limitCount);//加载配置好的规则 FlowRuleManager . loadRules(rules);原创 2023-07-02 14:41:02 · 420 阅读 · 0 评论 -
SpringBoot自定义拦截器实现权限过滤功能(基于责任链模式)
项目采用Spring Boot 2.7.12 + JDK 8实现,权限认证就是一个拦截的过程,所以在实现的时候理论上可以做到任意的配置,对任意接口设置任意规则。考虑到鉴权是一系列顺序执行,所以使用了责任链模式进行设计和实现。原创 2023-06-04 15:07:57 · 3037 阅读 · 0 评论 -
SpringBoot集成ElasticSearch
被逼无奈,各行各业都在卷,给自己充电学习了Elasticsearch,在学完基础知识后(其实就是CRUD😂),就去Springboot中尝试整合ES。终于抽出时间,将学习的东西整理分享在此,欢迎大家批评指正哈~原创 2023-05-28 18:00:01 · 11647 阅读 · 3 评论 -
SpringBoot自定义Mybatis拦截器实现扩展功能(比如数据权限控制)
实际工作中,使用Mybatis拦截器可以做一些数据过滤、数据加密脱敏、SQL执行时间性能监控和告警等业务。MyBatis拦截器默认可以拦截的类型只有四种,即四种接口类型Executor、StatementHandler、ParameterHandler和ResultSetHandler。对于我们的自定义拦截器必须使用MyBatis提供的@Intercepts注解来指明我们要拦截的是四种类型中的哪一种接口。原创 2023-03-17 23:05:42 · 1200 阅读 · 1 评论 -
设计模式-服务定位器模式
设计模式-策略模式(服务定位器模式)原创 2023-03-01 22:53:51 · 1326 阅读 · 1 评论 -
SpringBoot+Redis+@Cacheable实现缓存功能
SpringBoot+Redis+@Cacheable实现缓存原创 2023-01-12 22:02:25 · 1331 阅读 · 0 评论 -
JDK8系列之使用Function函数式接口
函数式接口是jdk8的新特性之一,函数式接口是只包含一个抽象方法声明的接口。按分类主要分为四大接口类型: Function、Consumer、Predicate、Supplier。原创 2022-12-17 22:53:00 · 2404 阅读 · 0 评论 -
实现自定义Spring Boot Starter
利用 starter 实现自动化配置只需要两个条件:maven 依赖和配置文件,这里简单介绍下starter 实现自动化配置的流程。引入 maven 依赖实质上就是导入 jar 包,Spring Boot 项目启动的时候会找到 starter jar 包中的 resources/META-INF/spring.factories 文件,根据 spring.factories 文件中的配置,加载需要自动配置的类。以 mybatis-spring-boot-starter 为例,其自动配置类之一如下:对原创 2022-12-03 11:56:02 · 1335 阅读 · 0 评论 -
Mysql批量删除大量数据
假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE FROM syslogs WHERE statusid=1 会发现删除失败,因为lock wait timeout exceed的错误。如果要用order by 必须要和 limit 联用,否则被优化掉。然后分多次执行就可以把这些记录成功删除。...原创 2022-08-27 08:15:00 · 20481 阅读 · 0 评论 -
SpringBoot利用AOP记录系统日志
利用Spring框架中aop,我们可以实现业务代码与系统级服务进行解耦,例如日志记录、事务及其他安全业务等,可以使得我们的工程更加容易维护、优雅。一、添加依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>二、自定义注解@T原创 2022-05-07 19:15:00 · 4463 阅读 · 0 评论 -
解决SpringBoot @Value注解静态属性无法注入问题
解决@Value注解静态属性无法注入问题解决方案一:使用 set 方法解决方案二:使用 @PostConstruct 方法最近在项目中遇到一个问题:在给static修饰的变量做@Value注入时,发现变量值为null,发现@Value只能给普通变量做值注入,无法为static属性赋值。@Data@Componentpublic class ApiConfig { @Value("${openapi.appKey:test21c454457f28a2c31}") private St原创 2022-05-06 23:15:00 · 1649 阅读 · 0 评论 -
Excel导入校验字段及其优化
一、产品需求:1:excel数据模板下载2:excel数据导入3:导入得时候根据模板得校验规则来进行筛选,导入成功得返回成功列表,数据有问题得返回失败列表,失败列表支持数据编辑修正看到需求第一眼可能就是第三列有点难度,我们知道,传统得数据校验是在DTO上面加注解//第一种public Result test1(@RequestBody @Validated TestDTO dto) {...}//第二种public Result test2(@RequestBody @Valid Tes原创 2022-04-06 22:15:00 · 3591 阅读 · 1 评论 -
【基于SpringBoot和Mybatis-Plus的关联表关联关系保存和修改】
本项目是个微服务项目,采用前后端分离方式进行协作开发。需求描述:表A和和表B通过equity_id进行关联,其中A->B是一对多关系。对此关联关系保证可编辑和新增。整体思路:新增时候直接双向绑定,修改时候先根据id全部删除,再新增关联关系。特此设计整理如下:一、权益表结构和权益实体类1.equity_limit_buy_setCREATE TABLE `equity_limit_buy_set` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMEN原创 2022-04-03 16:55:04 · 2284 阅读 · 0 评论 -
Spring Boot + Redission实战 -> 实现分布式锁
Redission实现分布式锁1.添加Redission依赖2.自定义注解类型实现分布式锁:@Lock3.分布式锁切面:LockAspect4.任务推送执行器TaskPushExecutor5.查询执行日志状况需求场景:执行推送任务,保证每个任务只推送一次。处理流程:将需要幂等性的接口加上自定义注解。然后编写一个切面,在Around方法里逻辑:尝试获取分布式锁(带过期时间),成功表明没重复提交,否则就是重复提交了。具体的redis已经配置在了nacos中,这里不做赘述。1.添加Redission依赖原创 2022-02-23 21:15:00 · 1721 阅读 · 0 评论 -
SpringBoot2.x 全局事务配置
首先依旧还是在启动类上加上事务开启注解@EnableTransactionManagement如下@SpringBootApplication(scanBasePackages = "com.xxx")@MapperScan("com.xxx.service.db.repository")@EnableDiscoveryClient@EnableFeignClients@EnableTransactionManagementpublic class MthCmsServiceApplicati原创 2022-02-15 22:30:00 · 1137 阅读 · 0 评论 -
SpringBoot中SpringContextHolder工具类使用
SpringContextHolder作用:以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext。SpringContextHolder@Componentpublic class SpringContextHolder implements ApplicationContextAware { /** * 以静态变量保存ApplicationContext,可在任意代码中取出Applicaiton原创 2022-02-15 20:45:00 · 6725 阅读 · 0 评论 -
SpringBoot中使用异步方法优化Service逻辑,提高接口响应速度
这里写目录标题一、异步二、SpringBoot中的异步方法三、自定义线程池执行异步方法四、捕获(无返回值的)异步方法中的异常五、获取(有返回值)异步方法的返回值六、项目整体结构和代码一、异步异步方法适用于逻辑与逻辑之间可以相互分割互不影响的业务中, 如生成验证码和发送验证码组成的业务, 其实无需等到真正发送成功验证码才对客户端进行响应, 可以让短信发送这一耗时操作转为异步执行, 解耦耗时操作和核心业务。有个业务场景,业务数据审核通过后需要给用户发短信,发短信过程比较耗时,可能需要几秒甚至十几秒,因此使原创 2021-11-14 22:47:43 · 1331 阅读 · 0 评论 -
SpringBoot打包方式以及将war包部署到Tomcat服务器
SpringBoot打成war包一、修改pom.xml文件将默认的jar方式改为war二、排除内置的Tomcat容器(两种方式都可)1.排除spring-boot-starter-web中的Tomcat2.添加依赖三、继承SpringBootServletInitializer实现configure方法1.方式一,启动类继承SpringBootServletInitializer实现configure2.方式二,新增加一个类继承SpringBootServletInitializer实现configure四转载 2021-11-04 21:15:00 · 2466 阅读 · 0 评论 -
SpringBoot+Shiro+JWT实现登录和权限控制
SpringBoot+Shiro+JWT实现登录和权限控制认证和授权Shiro 和JWT的简单介绍实现认证和授权的整体思路数据库表设计代码实现登录JWT生成token(附带验证的一些工具类)过滤器自定义MyRealmMyRealm的解释Shiro注解代码测试登录未携带token访问资源携带token访问需要guest角色但却是admin的tokenguest权限guest的token权限不足的情况有权限访问认证和授权认证(authentication)在程序中认证要做的事情主要是搞明白访问者是谁,他有转载 2021-10-21 22:15:00 · 1361 阅读 · 1 评论 -
SpringBoot2数据库连接池自动装配原理,以及如何配置使用其他的数据库连接池(druid)为例
SpringBoot2数据库连接池自动装配原理一、SpringBoot的数据库连接池的相关默认二、SpringBoot默认的数据库连接池,以及自动装配原理三、使用其他的数据库连接池:例如Druid一、SpringBoot的数据库连接池的相关默认SpringBoot之前的版本默认使用的是Tomcat的数据库连接池较新的版本2.X,默认使用的是Hikari(我使用的是2.2.1),具体可以通过DataSourceConfiguration查看默认支持数据库连接池:Tomcat、Hikari、Dbcp2原创 2021-10-12 19:00:00 · 2770 阅读 · 0 评论 -
SpringBoot使用Flyway进行数据库管理
SpringBoot使用Flyway进行数据库管理一、Flyway简介二、SpringBoot集成使用三、项目整体结构一、Flyway简介Flyway是一款数据库迁移(migration)工具。简单点说,就是在你部署应用的时候,帮你执行数据库脚本的工具。Flyway支持SQL和Java两种类型的脚本,你可以将脚本打包到应用程序中,在应用程序启动时,由Flyway来管理这些脚本的执行,这些脚本被Flyway称之为migration。就目前而言,我们部署应用的流程大概是这样的:开发人员将应用程序打包、按原创 2021-09-17 10:38:52 · 847 阅读 · 0 评论 -
SpringBoot2.6.2集成Swagger2.9.2
SpringBoot集成swagger21 背景2 使用2.1 maven依赖2.2 配置代码2.3 接口配置2.4 访问2.5 swagger2静态资源1 背景springBoot作为微服务首选框架,为其他服务提供大量的接口服务。接口对接方需要实时最近的接口文档。swagger可以通过代码和注释自动为web项目生成在线文档,这里使用swagger。2 使用2.1 maven依赖 <!-- swagger --> <dependency>原创 2021-09-08 10:22:15 · 2844 阅读 · 2 评论 -
SpringBoot配置连接两个或多个数据库
一、背景项目中需要从两个不同的数据库查询数据,之前实现方法是:SpringBoot配置连接一个数据源,另一个使用jdbc代码连接。为了改进,现在使用SpringBoot配置连接两个数据源。二、实现效果一个SpringBoot项目,同时连接两个数据库:比如一个是pgsql数据库,一个是oracle数据库(啥数据库都一样,连接两个同为oracle的数据库,或两个不同的数据库,只需要更改对应的driver-class-name和jdbc-url等即可)注意:连接什么数据库,要引入对应数据库的包。三、转载 2021-09-02 22:43:22 · 10170 阅读 · 0 评论 -
远程debug调试项目
一、远程调试将程序在测试环境中以debug模式启动,在本机使用IDEA在工程中设置断点进行调试。二、环境搭建2.1 编写测试代码pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/原创 2021-07-21 23:22:10 · 345 阅读 · 0 评论 -
使用webhook推送消息给群中钉钉机器人或者用户
项目中需要给企业微信群使用钉钉机器人定时提醒功能,特此整理设计开发方案如下。一、创建钉钉群创建步骤请参考: 自定义机器人接入,创建好机器人后,复制出机器人的Webhook地址,将其塞入数据库表DINGTALK_ROBOT_TOKEN中。...原创 2021-07-17 11:01:16 · 5048 阅读 · 0 评论