如何实现接口的幂等性

1,什么是幂等性

即相同的多次请求,只执行一次。

2,简述怎么保证幂等性?

单机部署的场景
使用唯一标识符:
在客户端发起请求时,附加一个唯一的请求标识符(如 UUID)。服务端接收到请求后,检查这个标识符是否已经处理过。如果已处理过,直接返回之前的结果;否则,处理请求并记录标识符。

分布式部署场景
借用脱离服务自身存储外的第三方工具,如:redis缓存,mysql中的唯一约束,s3存储等都可以

3,举个栗子

以数据库为例

首先简单创建一张表

CREATE TABLE `roejrtest`.`uq`  (`id` int NOT NULL AUTO_INCREMENT,`key` varchar(255) NULL,`value` varchar(255) NULL,`uuid` varchar(200) NOT NULL,PRIMARY KEY (`id`),UNIQUE INDEX `index_uq_uuid`(`uuid`)
);

创建接口进行测试(基础的就不全部展示了),有需要请查看https://blog.csdn.net/weixin_54925172/article/details/139564046?spm=1001.2014.3001.5501

controller类

package com.luojie.controller;import com.luojie.controImpl.IdempotenceTestImpl;
import com.luojie.moudle.IdempotenceTestModule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;@RestController
public class IdempotenceTestController {@Autowiredprivate IdempotenceTestImpl idempotenceTest;@PostMapping("/idempotence/test")public void idempotenceTest(@RequestHeader("x-uuid") String uuid, @RequestBody IdempotenceTestModule module) {idempotenceTest.setup(uuid, module);}
}

实现类

package com.luojie.controImpl;import com.luojie.dao.mapper2.Mapper2;
import com.luojie.moudle.IdempotenceTestModule;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class IdempotenceTestImpl {@Autowiredprivate Mapper2 mapper2;public void setup(String uuid, IdempotenceTestModule module) {// 检查是否已经存在String getuuid = mapper2.getuuid(uuid);if (StringUtils.isNotBlank(getuuid)) {throw new IllegalArgumentException("已经处理过了");}// 不存在则继续module.setUuid(uuid);mapper2.insertUq(module);}}

测试,第一次请求时,检查未被拦截

后续请求时,被拦截

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/45307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04.6新系统没有wifi驱动(已解决)

Ubuntu20.04.6新系统没有wifi驱动(已解决) 问题描述硬件环境无线网卡驱动安装网络查看驱动安装 其他因素参考文献 问题描述 在装完ubuntu20.04.6之后发现网络设置里没有无线网。缺少无线网卡驱动。 硬件环境 电脑:i9-13900H 无线网卡&…

南京邮电大学运筹学课程实验报告1 图与网络求解 指导

一、题目描述 实验四 图与网络问题求解    实验属性: 设计型    实验目的 1.理解图的基本概念; 2.掌握运筹学软件的使用方法; 3. 掌握图中Dijkstra算法Matlab求解原理和方法。 …

Java性能优化-HashMap遍历的7种方式及性能测试对比

场景 Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化: Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_java热点函数-CSDN博客 参考以上性能测试工具的使用。下面针对Java中对HashMap的7种遍历方…

《梦醒蝶飞:释放Excel函数与公式的力量》11.3 ISTEXT函数

第11章:信息函数 第三节 11.3 ISTEXT函数 11.3.1 简介 ISTEXT函数是Excel中的一个信息函数,用于检查指定单元格中的内容是否为文本。如果单元格内容是文本,则返回TRUE;否则返回FALSE。ISTEXT函数在数据验证、条件格式化和逻辑判…

社区团购小程序源码系统 带完整的安装代码以及搭建部署教程

系统概述 在这个数字化时代,线上活动成为了连接用户与组织者的桥梁。为了满足不同场景的需要,开发一个灵活、可定制的在线活动报名表单小程序显得尤为重要。本文将深入介绍一个自定义在线活动报名表单小程序的源码系统,并提供详细的搭建部署…

QT的OpenGL渲染窗QOpenGLWidget Class

Qt - QOpenGLWidget (class) (runebook.dev) 一、说明 QOpenGLWidget 类是用于渲染 OpenGL 图形的小部件。从Qt 5.4就开始退出,它对于OpenGL有专门的配合设计。 二、QOpenGLWidget类的成员 2.1 Public类函数 QOpenGLWidget(QWidget *parent nullptr,Qt…

Android高级——Logger日志系统

Logger日志系统 Logger日志系统是基于内核中的Logger日志驱动程序实现将日志记录保存在内核空间中使用一个环形缓冲区来保存日志,满了之后,新的日志就会覆盖旧的日志 日志类型 main,记录应用程序级别system,记录系统级别radio&…

在Ubuntu下安装samba实现和Windows系统文件共享

一、安装 apt install -y samba samba-clientSamba is not being run as an AD Domain Controller: Masking samba-ad-dc.service Please ignore the following error about deb-systemd-helper not finding those services. (samba-ad-dc.service masked) Created symlink /et…

Electron31.x+vite5+vue3 setup客户端Exe聊天系统演示

electron31-vue3chat:首创研发跨桌面端electron31vite5pinia2element-plus等技术实战搭建仿微信电脑版聊天程序。整合聊天、联系人、收藏、朋友圈、小视频号、我的等功能模块。 首创Electron31Vite5ElementPlus仿微信电脑端聊天Exe系统【完整演示】 框架技术 Vscod…

百度网盘资料使用

1. 将链接复制到浏览器打开,点击提取文件 2. 提取文件,进入如下界面 3. 因为文件太大,而且未开会员,所以无法全部转存到网盘,只能分批次转存 点击目录,进入文件夹 1)选择一个喜欢的文件&#…

9.Python学习:Socket

1.网络通信要素(IP端口传输协议) 2.Socket编程 2.1TCP、UDP协议了解 2.2 Socket流程 服务端有两个socket对象,客户端有一个 3.Socket实战 服务端代码: import socket #创建Socket对象 sksocket.socket() #绑定ip与端口号-使…

Rust 集合与字符串

Rust 集合与字符串 Rust 是一种系统编程语言,以其内存安全性、速度和并发性而闻名。在 Rust 中,集合和字符串是处理数据的重要组成部分。本文将深入探讨 Rust 中的集合和字符串,包括它们的类型、用法和性能特点。 集合 Rust 提供了多种集合类型,用于存储和处理数据。这些…

在分布式环境中,怎样保证 PostgreSQL 数据的一致性和完整性?

文章目录 在分布式环境中保证 PostgreSQL 数据的一致性和完整性一、数据一致性和完整性的重要性二、分布式环境对数据一致性和完整性的挑战(一)网络延迟和故障(二)并发操作(三)数据分区和复制 三、保证 Pos…

Apache Spark分布式计算框架架构介绍

目录 一、概述 二、Apache Spark架构组件栈 2.1 概述 2.2 架构图 2.3 架构分层组件说明 2.3.1 支持数据源 2.3.2 调度运行模式 2.3.3 Spark Core核心 2.3.3.1 基础设施 2.3.3.2 存储系统 2.3.3.3 调度系统 2.3.3.4 计算引擎 2.3.4 生态组件 2.3.4.1 Spark SQL 2.…

网络基础:Vlan原理与配置

VLAN(Virtual Local Area Network,虚拟局域网)是一种将一个物理网络划分为多个逻辑子网的技术。它通过在网络交换机上配置,使得不同VLAN中的设备即使连接在同一个物理交换机上,也不能直接进行通信,从而实现…

HiFi音频解码器:音质提升的秘密武器

HiFi音频解码器:音质提升的秘密武器 在音频爱好者的世界里,解码器、耳放、前置放大器和后级功放等设备是不可或缺的神器。它们不仅能让高端音箱和耳机表现出色,还能让音乐听起来更加真实动人。但对于刚刚入门的音频新手来说,这些设…

某企业数据治理总体解决方案(45页PPT)

引言:集团企业数据治理总体解决方案旨在构建一个高效、安全、合规且灵活的数据管理体系,以支持企业决策优化、业务创新、风险管理和运营效率提升。该方案通过整合数据资源、规范数据流程、强化数据质量和促进数据共享,实现数据资产的最大化价…

java基础(知识点整理)

目录 1.main方法 2.修饰符 3.基本数据类型: 4.包装器类: 5.static关键字 6.finall关键字 7.String类型 8.八大排序 9.抽象类和接口的区别: 10.面向对象:封装 继承 多态 11.Object类 12.内部类: 13.lambda…

Lingo学习(三)——工厂合并、运算符、内置函数

一、工厂合并 (一) 工厂合并——生产二维矩阵 【引入】 sets: factory /1..6/ : a; plant /1..8/ : d; Cooperation(factory,p lant) : c, x; endsets 以上程序可…

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(三)

上一篇圆形表盘指针式仪表的项目受到很多人的关注,咱们一鼓作气,把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数,并将读数结果进行输出,若需要完整数据集和源代码可以私信。 目录 &a…