当前位置:首页 > 科技  > 软件

一个注解实现接口幂等,这样才优雅!

来源: 责编: 时间:2023-08-05 11:46:08 2624观看
导读场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有问题吗?谁能说有问题?一般情况下是没什么问题

场景

码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

上述代码有问题吗?谁能说有问题?一般情况下是没什么问题,但是在高并发的场景下肯定是存在问题,为什么?S2r28资讯网——每日最新资讯28at.com

因为有事务的隔离性,step1这个阶段对住院号的校验肯定是存在问题的,在高并发的场景下无法保证这里的校验一定准确。S2r28资讯网——每日最新资讯28at.com

其实这个接口的并发并不高,在码猿慢病云管理系统中一般不会出现这种问题,那么什么时候会出现呢?S2r28资讯网——每日最新资讯28at.com

医院中大部分是内网+外网,如果由于网络的抖动,系统请求响应的时间延迟,这样会导致医护操作时会出现重复点击的情况,比如1秒中之内由于第一次点添加患者这个按钮没反应,往往护士都会重复点击,这种情况下是会出现问题。S2r28资讯网——每日最新资讯28at.com

这里我们就暂且不谈对单个接口的幂等优化了,要想一个方案全局解决这个问题,在码猿慢病云管理系统中其实只要保证这种并发不高的接口在一定时间段内保证幂等即可,比如5秒之内,这样在5秒之内护士重复点击就没事。S2r28资讯网——每日最新资讯28at.com

解决方案

在码猿慢病云管理系统中新增了一个注解:@RepeatSubmit,代码如下:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

只需要将该注解标注在新增、修改、删除接口上就能保证在默认的5秒之内接口幂等。S2r28资讯网——每日最新资讯28at.com

比如新增住院患者这个接口:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

那么原理是什么?其实很简单,先来说下原理,再介绍具体的实现:S2r28资讯网——每日最新资讯28at.com

  1. AOP拦截增强@RepeatSubmit注解
  2. 获取请求的URL、IP地址、请求参数
  3. 将请求URL、IP地址、请求参数以一定形式转为key
  4. 借助Redis的setNx命令将key存入Redis,且设置失效时间
  5. 如果存入成功则允许访问,失败则抛出异常
  6. 全局异常捕获,输出指定信息给客户端

上述6个步骤中其实只有一点比较难实现的,其他的都是基本操作,就是获取这个请求参数,下面将详细介绍一下如何获取这个请求参数。S2r28资讯网——每日最新资讯28at.com

获取请求参数

对于form-data的入参只需要调用HttpServletRequest的API读取,但是对于@RequestBody标注的入参是通过IO流读取数据,且IO流只能被读取一次,如果在AOP中读取了,那么在接口层面的入参读取肯定是有问题,报错如下:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

解决方案也很简单,只需要保证IO流能够多次读取即可,下面就来介绍一下方案。S2r28资讯网——每日最新资讯28at.com

这里我们可以利用装饰者模式对 HttpServletRequest 的功能进行增强,具体做法也很简单,我们重新定义一个 HttpServletRequest:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

这段代码并不难,很好懂。S2r28资讯网——每日最新资讯28at.com

首先在构造 RepeatedlyRequestWrapper 的时候,就通过 IO 流将数据读取出来并存入到一个 byte 数组中,然后重写 getReader 和 getInputStream 方法,在这两个读取 IO 流的方法中,都从 byte 数组中返回 IO 流数据出来,这样就实现了反复读取了。S2r28资讯网——每日最新资讯28at.com

接下来我们定义一个过滤器,让这个装饰后的 Request 生效:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

判断一下,如果请求数据类型是 JSON 的话,就把 HttpServletRequest “偷梁换柱”改为 HttpRequestWrapper,然后让过滤器继续往下走。S2r28资讯网——每日最新资讯28at.com

这样就可以配置后就可以在程序中反复读取参数了!S2r28资讯网——每日最新资讯28at.com

防重注解实现

解决了参数读取的问题,下面就可以轻松实现这个防重注解了,首先定义注解com.code.ape.codeape.common.security.annotation.RepeatSubmit:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

接下来直接用AOP实现,com.code.ape.codeape.common.security.component.CodeapeRepeatSubmitAspect代码如下:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

逻辑很简单,上述已经介绍过完整的流程,这里需要注意的是参数的读取,代码如下:S2r28资讯网——每日最新资讯28at.com

图片图片S2r28资讯网——每日最新资讯28at.com

其实就是将request判断下是否是经过过滤器封装后的HttpRequestWrapper对象,如果是的话则是@RequestBody入参,直接从IO流中读取。S2r28资讯网——每日最新资讯28at.com

总结

本节内容介绍了防重注解@RepeatSubmit的实现原理,后续开发中只需要在非查询接口中添加这个注解就能保证在一定时间内防止重复提交。S2r28资讯网——每日最新资讯28at.com

码猿慢病云管理系统已经在星球中陆续更新,目前更新内容如下:S2r28资讯网——每日最新资讯28at.com

前言     01 项目架构+业务介绍     02 三方组件介绍     03 服务端项目部署     04 前端项目部署     05 多租户架构设计     06 医疗系统中的权限如何设计?     07 项目搭建     08 关掉验证码登录     09 开发平台自动生成业务代码认证鉴权     01 认证登录生成token     02 token检验、鉴权     03 token有效期设置     04 刷新token     05 检查token     06 服务中如何获取当前登录用户信息?     07 接口对外暴露     08 接口只允许内部调用怎么处理?     09 如何实现token中继?     10 当前登录用户身份信息如何异步传递?     11 科室权限如何定一个注解自动注入?     12 一个注解防止接口重复提交业务     01 科室管理     02 医院管理     03 角色管理

S2r28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-146-0.html一个注解实现接口幂等,这样才优雅!

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 从零到英雄:高并发与性能优化的神奇之旅

下一篇: WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

标签:
  • 热门焦点
  • 摸鱼心法第一章——和配置文件说拜拜

    摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • 把LangChain跑起来的三个方法

    把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • .NET 程序的 GDI 句柄泄露的再反思

    .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 从零到英雄:高并发与性能优化的神奇之旅

    从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 得物宠物生意「狂飙」,发力“它经济”

    得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 7月4日见!iQOO 11S官宣:“鸡血版”骁龙8 Gen2+200W快充加持

    7月4日见!iQOO 11S官宣:“鸡血版”骁龙8 Gen2+200W快充加持

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top