当前位置: 首页 > wzjs >正文

福州 网站设计南京网站建设公司有哪些

福州 网站设计,南京网站建设公司有哪些,上海网站建设报价方案,常德网站建设要点一、背景:为什么需要幂等性 在微服务、分布式架构下,网络不可靠、请求重试机制(如前端超时重发、客户端重发、网关重试、消息消费失败重试等)会带来重复请求,如果接口没有幂等性,可能导致: 重复…

一、背景:为什么需要幂等性

在微服务、分布式架构下,网络不可靠、请求重试机制(如前端超时重发、客户端重发、网关重试、消息消费失败重试等)会带来重复请求,如果接口没有幂等性,可能导致:

  • 重复扣费
  • 重复订单
  • 重复数据写入
  • 资源状态异常

因此接口的幂等性是保障系统一致性、稳定性的关键。


二、幂等性的演进历程

阶段实现方式适用场景特点
1. 前端防重复提交禁用按钮、Token机制简单场景(如表单)限制小,易绕过
2. 数据库唯一约束唯一索引字段控制插入插入类接口利用数据库能力
3. 幂等标识(唯一业务ID)唯一业务号控制幂等订单类接口明确控制粒度
4. 分布式锁请求上锁任意接口控制请求串行,牺牲吞吐
5. 状态机机制状态+版本控制状态转换操作精细控制副作用
6. Redis 幂等性控制幂等Key+过期时间高并发下快速、安全,结合令牌机制

三、最佳实践总结

🧠 原则

  • 幂等性以“结果相同”为基准,副作用不可重复。
  • 控制粒度应适当:写操作必须幂等,读操作天然幂等。
  • 幂等 Token 最好由客户端生成或服务端下发后强制绑定。

✅ 最佳实践建议

  • 业务唯一标识驱动幂等性,如订单号、支付流水号。
  • 幂等性应放在业务代码逻辑前端处理,即“第一次判断是否重复提交”。
  • 采用 Redis + 原子操作(如SETNX)+ Token + TTL 实现防重。
  • 接口幂等性建议作为注解能力进行抽象封装,统一使用。

四、Spring Boot 实现示例(完善版)

下面我们以 Token机制 + Redis原子写入实现接口幂等性,构建完整示例。

1️⃣ 添加依赖

<!-- Redis starter -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2️⃣ Redis配置类(Lettuce连接池)

@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, String> template = new RedisTemplate<>();template.setConnectionFactory(factory);template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(new StringRedisSerializer());return template;}
}

3️⃣ 幂等Token生成接口(服务端)

@RestController
@RequestMapping("/token")
public class TokenController {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@GetMapping("/generate")public String generateToken() {String token = UUID.randomUUID().toString();redisTemplate.opsForValue().set("idem-token:" + token, "valid", 5, TimeUnit.MINUTES);return token;}
}

4️⃣ 幂等校验注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Idempotent {String key() default "";  // 可自定义Key策略
}

5️⃣ 幂等校验切面

@Aspect
@Component
public class IdempotentAspect {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Around("@annotation(idempotent)")public Object checkIdempotency(ProceedingJoinPoint joinPoint, Idempotent idempotent) throws Throwable {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String token = request.getHeader("Idempotency-Token");if (StringUtils.isEmpty(token)) {throw new RuntimeException("幂等Token不能为空");}String redisKey = "idem-token:" + token;Boolean result = redisTemplate.delete(redisKey);  // 核心逻辑:删除即消费if (Boolean.FALSE.equals(result)) {throw new RuntimeException("重复请求,请勿重复提交");}return joinPoint.proceed();}
}

6️⃣ 接口使用示例

@RestController
@RequestMapping("/order")
public class OrderController {@PostMapping("/create")@Idempotentpublic String createOrder(@RequestBody OrderDTO orderDTO) {// 模拟业务逻辑return "订单创建成功,订单号:" + UUID.randomUUID().toString();}
}

7️⃣ Postman 调用流程:

  1. 调用 GET /token/generate 获取 token

  2. 调用 POST /order/create,在请求头加上:

    Idempotency-Token: 你刚刚拿到的token
    

多次调用同一个 token,只会成功一次,后续将抛出“重复请求”异常。


五、可扩展建议

功能实现方式
支持注解中的自定义 key 逻辑SpEL 表达式,读取参数字段
幂等记录持久化Redis + 数据库双写
异常重试队列支持Kafka / RocketMQ 消息幂等处理
Redisson替换RedisTemplate使用 RLock.tryLock() 可实现锁粒度的幂等控制

六、架构图(逻辑)

客户端|
[请求附带Token]|
Spring Boot 接口(注解拦截)|
切面逻辑校验 Token|
Redis SETNX 删除 key -> 是第一次? -> 继续业务|
业务逻辑执行(订单创建、支付、提交...)

后续实例回陆续添加

参数幂等、结果缓存、幂等日志记录


文章转载自:

http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://00000000.qfkdt.cn
http://www.dtcms.com/wzjs/603796.html

相关文章:

  • 服装 公司 网站建设建一个网站大概需要多长时间
  • 国际进出口贸易网站定州网页设计
  • 石家庄网站建设 河北供求网wordpress keywords 用逗号 区分关键字
  • 正规品牌网站设计水果网站 模板
  • 邯郸网站建设哪家好宝塔wordpress建站教程
  • 顾家家居网站是哪个公司做的旅游企业做网站主要目的
  • 鹰潭建设网站天津设计网站公司
  • 个人网站网址有哪些荣耀应用商店app下载
  • iis网站访问权限小型网站的建设与开发
  • 娄底网站建设公司wordpress meta query
  • 如何在ftp做网站怎么才能创建网站
  • 怎样做一个简单的网站首页设计风格网站欣赏
  • 宁波网站建设与设计制作济南网站建设 行知科技
  • 网站建设 技术 哪些方面网站怎么做404页面的跳转
  • 口碑好网站建设公司中型企业名录查询系统
  • 织梦cms做企业网站wordpress您找的页面不存在
  • html5网站在线制作上海将打造五大未来产业集群
  • dnf怎么做提卡网站盐城专业做网站
  • 自己做的网站怎么排名苏州做网站哪家好
  • 中国建设银行网站用户注册赛扶做网站
  • 做网站建设哪家公司好旅行网站开发
  • wordpress图纸管理网站产品广告设计
  • 网站设计服务费做什么费用南阳网站推广排名
  • 做直播网站赚钱网站首页布局seo
  • wordpress模板电子书下载站wordpress 无觅
  • 建设团购网站建筑施工证查询网站
  • 网上购物正品网站楚雄网站建设rewlkj
  • 美术馆网站网页设计方案网站怎么推广和应用
  • 做一名优秀网站设计师计划企业微信管理系统
  • 网站空间的分类阿里云商业网站建设视频