您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

SpringBoot如何实现接口幂等性操作?

时间:2023-02-02 14:48:25  来源:今日头条  作者:


 

什么是接口的幂等性?

幂等作为一个数学概念,是指在某个一元运算过程中,任意次数的运算结果会与一次运算结束后的结果是相同的。在计算机操作中,一个幂等操作的特点是任意执行一次或者多次其操作所产生的影响与执行一次操作产生的影响结果是一样的。

而所谓的幂等函数或者是幂等方法,则是指如果使用相同的参数进行重复执行,执行一次与执行多次所产生的结果是一样的。也就是说函数或者是方法的不会对整个系统的状态产生影响,也不用担心多次执行函数会对系统产生改变。

接口幂等性则是指对于某个接口来讲,请求一次的效果与请求多次对系统本身的影响是一样的,也就是说第一次请求对系统产生了一定的影响,但是在后续请求过程中对系统产生的影响与第一次请求所产生的影响是一样的,不会对系统带来副作用。

为什么需要幂等性操作?

一般我们向外提供的接口都是可以正常返回信息的,也就不会出现重复调用接口的情况,但是如果遇到了网络卡顿、页面卡顿等情况有可能会出现页面表单重复提交,网络卡顿有可能会出现接口超时,造成的接口重复调用,或者是会出现恶意攻击接口等情况。

而如何接口采用了幂等性操作其最大的优势就是可以保证接口调用一次的效果与多次调用的效果是样的,可以有效的避免因为重复调用而带来的诸多系统未知错误。

引入幂等性之后可以简化客户端的处理逻辑,也能有效的防止表单的重复提交。但是引入幂等性所付出的代价就是后端处理逻辑会相对较复杂。所以,在引入幂等性操作的时候首先需要考虑的就是是否有必要引入,要根据实际的情况,结合具体的业务来完成对幂等性的引入。

如何所实现幂等性操作?

第一种、数据库唯一键约束

数据库的主键唯一性约束,一般比较适合对于插入操作的幂等性约束,因为我们知道,一张数据库表中的一条记录只能有一个唯一的主键来进行标识记录。

使用数据库主键唯一性约束作为幂等条件的时候需要注意的是,在实际开发中我们所使用的主键并不是数据库中自增的主键,而是采用一些分布式的ID来充当组件,这样才能有效的保证在分布式环境下的ID全局唯一性。这样就可以保证幂等性的操作了。如下图所示。


 

主要流程包括

 

  1. 客户端执行创建请求,调用服务端接口
  2. 服务端执行业务逻辑采用分布式ID生成算法生成一个ID,将对应的ID插入对应记录的主键,然后执行数据插入操作。
  3. 服务端将对应的数据插入到数据库中,如果这个时候继续有同样的请求进入,则数据库就会报出主键冲突的异常,这个时候就可以提示客户度数据库中已存在该条信息。请勿重复提交。

 

第二种、数据乐观锁操作

数据库乐观锁操作是一种适用于更新操作的的幂等性解决方案。其实现需要我们在数据库表中多加入一个字段来充当当前数据版本号的标识。这样如果对这个数据进行更新的时候,就可以将该版本号作为标识来判断数据是否被更新了。

update table set number1 = 123 where id= 1 and version = 5;

例如如果执行了上面这个操作之后,我们可以将id = 1 并且 version=5 的数据进行了更新,在更新成功之后,version就会变成 6,那么如果这个时候还有请求进入其带入到更新操作依然会是version为5的操作,实际上,这个时候version已经变成了6,那么显然version为5的操作就是找不到的,就可以保证了更新操作的幂等性。并且多次执行也不会对数据产生多余的影响。

第三种、利用Token防止重复提交

针对前后端分离项目,在客户端连续进行点击按钮或者是调用超时的时候,利用Token就可以有效的防止重复提交。

简单的说就是在调用方调用接口的时候先向后端请求了一个全局的TokenID,在请求的时候携带这个Token进行调用。后端需要根据这个Token作为key,用户信息作为value到缓存中去验证,如果存在对应的数据则执行删除操作,然后后续的逻辑正常执行,如果没有找到或者是找到的数据不匹配那么就无法执行后续的操作。有点像是令牌,这个令牌的获取也可以进行流控操作。通过令牌的多少来控制发到后端请求的数量,这样也可以有效的减轻后端系统的压力。如下图所示


 

 

  1. 服务端提供获取Token的接口,这个Token可以是一个序列号也可以是一个分布式ID也可以其他唯一标识的字符串
  2. 客户端调用获取Token接口,这个时候服务端会生成一个Token串。
  3. 然后将该字符串存储到redis缓存中,并且对这个Token串设置一个过期时间
  4. 将Token返回到客户端,客户端将Token携带到请求头部
  5. 客户端执行表单提交操作,并且将头部的Token一起发到服务端
  6. 服务端获取到头部的Token之后,根据Token从Redis缓存中查找对应的信息。判断是否存在。
  7. 如果服务端判断到对应Key存在并且信息匹配,那么就删除对应的key之后执行后续的业务,如果不存在则抛出异常提示重复提交异常。

 

注意,在并发场景中,执行Redis操作需要保证操作的原子性,这个时候有可能因为多个线程的进入而无法保证幂等性操作,这个是时候就需要采用分布式锁机制来保证原子性操作。

第四种、唯一标识匹配

通过上面的分析,要想保证幂等性操作,其实主要就是要让后续的操作逻辑能够正常执行,那么这个时候,我们只需要保证每次请求都可以被唯一标识就可以保证是否重复提交。这个时候我们可以为每一个请求分配一个唯一的标识,这个标识是一个短期标识。并且一般由下游的服务来生成,这个时候就保证了当上游服务请求发到下游服务的时候两者都知道对应的请求是否发生了变化。如下图所示。


 

上面这个操作有点类似于Token获取操作的思路。可以参照Token方式来对其进行理解。

总结

上面我们介绍了接口幂等性操作,并且介绍了保证幂等性的几种方式。当然上述的这些内容在单体应用的情况下基本上不会出现问题,但是如果在并发场景下一定要结合锁机制来使用才能有效的保证数据的安全性。



Tags:SpringBoot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: SpringBoot  点击:(21)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19  Search: SpringBoot  点击:(88)  评论:(0)  加入收藏
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: SpringBoot  点击:(93)  评论:(0)  加入收藏
公司用了六年的 SpringBoot 项目部署方案,稳得一批!
本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作。 profiles指定不同环境的配置 maven-assembly-plugin打发布压...【详细内容】
2024-01-10  Search: SpringBoot  点击:(176)  评论:(0)  加入收藏
简易版的SpringBoot是如何实现的!!!
SpringBoot作为目前最流行的框架之一,同时是每个程序员必须掌握的知识,其提供了丰富的功能模块和开箱即用的特性,极大地提高了开发效率和降低了学习成本,使得开发人员能够更专注...【详细内容】
2023-12-29  Search: SpringBoot  点击:(140)  评论:(0)  加入收藏
用 SpringBoot+Redis 解决海量重复提交问题
前言 一:搭建redis的服务Api 二:自定义注解AutoIdempotent 三:token创建和检验 四:拦截器的配置 五:测试用例 六:总结前言:在实际的开发项目中,一个对外暴露的接口往往会面临很多...【详细内容】
2023-12-20  Search: SpringBoot  点击:(55)  评论:(0)  加入收藏
SpringBoot中如何优雅地个性化定制Jackson
当使用 JSON 格式时,Spring Boot 将使用ObjectMapper实例来序列化响应和反序列化请求。在本教程中,我们将了解配置序列化和反序列化选项的最常用方法。一、默认配置默认情况下...【详细内容】
2023-12-20  Search: SpringBoot  点击:(134)  评论:(0)  加入收藏
springboot-如何集成Validation进行参数校验
一、步骤概览 二、步骤说明1.引入依赖包在 pom.xml 文件中引入 validation 组件,它提供了在 Spring Boot 应用程序中进行参数校验的支持。<!-- WEB 程序依赖包 --><dependen...【详细内容】
2023-12-13  Search: SpringBoot  点击:(159)  评论:(0)  加入收藏
优雅的springboot参数校验,你学会了吗?
前言在后端的接口开发过程,实际上每一个接口都或多或少有不同规则的参数校验,有一些是基础校验,如非空校验、长度校验、大小校验、格式校验;也有一些校验是业务校验,如学号不能重...【详细内容】
2023-11-29  Search: SpringBoot  点击:(200)  评论:(0)  加入收藏
Springboot扩展点之BeanDefinitionRegistryPostProcessor,你学会了吗?
前言通过这篇文章来大家分享一下,另外一个Springboot的扩展点BeanDefinitionRegistryPostProcessor,一般称这类扩展点为容器级后置处理器,另外一类是Bean级的后置处理器;容器级...【详细内容】
2023-11-27  Search: SpringBoot  点击:(177)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(6)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(22)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(59)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(50)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(40)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(53)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(71)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(91)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(88)  评论:(0)  加入收藏
站内最新
站内热门
站内头条