SpringBoot 增强库 yue-library 2.4.0 发布,优雅的实现接口幂等性

来源: 投稿
作者: yl-yue
2021-06-07

logo

yue-library简介

yue-library是一个基于SpringBoot封装的增强库

  • 丰富的Java工具类库
  • 优越的ORM框架
  • 优雅的业务封装
  • 优化的Spring环境配置
  • 完善的规约限制
  • 配套的代码生成平台
  • 安稳贴切的开源架构方案

版本更新日志

  • 主要变更:使用SpringBoot2.4新的配置文件机制,提供默认的优化配置实现。
  • 主要新特性:使用注解@ApiIdempotent可优雅的实现接口幂等性(数据脱敏功能延迟到2.4.1中发布)

新特性

  • 【base】新增@CarDrivingLicence@CarVin@CreditCode@ZipCode四个校验注解
  • 【base】迁移actuator配置至auth模块,添加actuator配置安全
  • 【base】actuator端点默认使用32222端口进行访问,与API服务端口进行区分,保持良好的安全忧患意识
  • 【base】网络代理,额外不代理地址默认添加所有内网网段
  • 【jdbc】完善逻辑删除,delete_time条件追加时判断sql中是否存在delete_time否则不再追加
  • 【redis】新增API接口幂等性优雅实现,使用@ApiIdempotent注解标注接口需要进行幂等性校验
  • 【test】新增模块分离测试
  • 【docs】新增安全规约
  • 【docs】优化异步线程池示例与完善文档
  • 【docs】完善逻辑删除文档
  • 【docs】添加分布式缓存示例与文档
  • 【docs】完善分布式锁与接口幂等性文档
  • 【docs】完善POJO与Lombok的使用说明
  • 【docs】添加类型转换器Bean别名规范
  • 【docs】完善JavaBean参数解析器文档,提示IPO中有无参构造时,解析List<String>类型需传标准是数组字符串
  • 【other】删除部分早已标记为失效的方法

Bug修复

  • 【web】解决SpringBoot2.4版本新出现的跨域问题 #I3OV7B
  • 【web】修复异步线程装饰器在开启ServletAsyncContext时,接口响应被无故追加404异常 #I3HTAW

Maven仓库实际发布版本号

j8.2.4.0j11.2.4.0

关键pom.xml依赖:

依赖 版本
spring-boot 2.4.3
spring-cloud 2020.0.2
spring-cloud-alibaba 2021.1
hutool 5.6.3
fastjson 1.2.76

工程结构

. yue-library
├── yue-library                       
│   ├── yue-library-dependencies      dependencies版本控制
│   ├── yue-library-base              基础核心模块,提供丰富的Java工具类库、接口参数校验、类型转换器等
│   ├── yue-library-base-crypto       加解密模块,提供对称、非对称和摘要算法、密钥交换加解密等
│   ├── yue-library-web               WebMvc模块,servlet编程,提供请求与响应参数的包装与解析等
│   ├── yue-library-webflux           WebFlux实现,响应式编程(如:SpringCloudGateway)
│   ├── yue-library-data-jdbc         ORM框架,基于SpringJdbc,拥有着强大性能的同时又不失简单灵活等
│   ├── yue-library-data-redis        Redis客户端,基于SpringRedis,更简单灵活,提供分布式锁等
│   ├── yue-library-auth-service      OAuth2认证模块,基于SpringSecurity,更简单灵活,提供全局token与登录等
│   ├── yue-library-auth-client       OAuth2客户端模块,提供获取当前登录用户状态信息等
│   └── yue-library-pay               支付模块,基于pay-java-parent,让你真正做到一行代码实现支付聚合
└── yue-library-samples               
    ├── yue-library-test              web测试项目,提供详细的特性使用示例、接口单元测试
    ├── yue-library-test-webflux      webflux测试项目,提供详细的特性使用示例、接口单元测试
    ├── yue-library-template-boot     SpringBoot项目模版,提供快速开发示例
    └── yue-library-template-cloud    SpringCloud项目模版,SOA共享架构(阿里巴巴中台)

快速开始

引入项目依赖

maven项目,在pom.xml文件中添加如下一段代码,并将${version}替换为对应版本号:Maven Central with version prefix filter

<parent>
	<groupId>ai.ylyue</groupId>
	<artifactId>yue-library-dependencies</artifactId>
	<version>${version}</version>
</parent>

随后引入所需要的模块,如WebMvc项目引入:yue-library-web

依赖说明:yue-library-base为基础模块,一般情况下不需要单独引入,如:web、data-jdbc、data-redis等模块皆已默认依赖。

<dependencies>
	<dependency>
		<groupId>ai.ylyue</groupId>
		<artifactId>yue-library-web</artifactId>
	</dependency>
	...
</dependencies>

启动项目

新建一个SpringBoot main方法启动类:

@SpringBootApplication
public class TestApplication {

	public static void main(String[] args) throws Exception {
		SpringApplication.run(TestApplication.class, args);
	}

}

写一个测试接口:

@RestController
@RequestMapping("/quickstart")
public class QuickstartController {

	@GetMapping("/get")
	public Result<?> get(JSONObject paramJson) {
		return ResultInfo.success(paramJson);
	}
	
}

访问接口测试,如:http://localhost:8080/quickstart/get

{
    "code": 200,
    "msg": "成功",
    "flag": true,
    "count": null,
    "data": {}
}

上述代码完全保持了SpringBoot的风格,但又使用到了yue-library的增强特性,如:

  • HTTP消息转换器支持使用Alibaba Fastjson作为参数获取对象
  • 请求参数智能解析,无需再为URL query-string、Body from-data、Body application/json传参方式烦恼
  • 错误时会对异常进行统一处理,响应RESTful风格的错误提示
  • 支持前端跨域请求

当然除了这些已使用到的特性之外,你还可以尝试如:响应时间类型时自动格式化、请求参数校验、API接口版本控制、反复读取Servlet输入流等。 并且在yue-library-samples目录下,存放着不同架构类型的示例模板,你可以根据自身需求选择,从而快速上手。

接口幂等性

什么是幂等性(引用自OCP项目文档)

HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同

简单来说,是指无论调用多少次都不会有不同结果的 HTTP 方法。

什么情况下需要幂等

业务开发中,经常会遇到重复提交的情况,无论是由于网络问题无法收到请求结果而重新发起请求,或是前端的操作抖动而造成重复提交情况。 在交易系统,支付系统这种重复提交造成的问题有尤其明显,比如:

  1. 用户在APP上连续点击了多次提交订单,后台应该只产生一个订单;
  2. 向支付宝发起支付请求,由于网络问题或系统BUG重发,支付宝应该只扣一次钱。 很显然,声明幂等的服务认为,外部调用者会存在多次调用的情况,为了防止外部多次调用对系统数据状态的发生多次改变,将服务设计成幂等。

开始使用

实现接口幂等性的方式有很多种,我比较推崇使用分布式锁或version令牌的方式,而上面我们已经介绍了分布式锁的使用,那么下面我们就来介绍下version令牌的实现与如何使用。

实现流程

客户端第一次请求:

  • 客户端发起请求获得version令牌
  • 服务端生成令牌并将之存入redis中,然后将生成的令牌返回给客户端。

客户端第二次请求:

  • 客户端将拿到的version令牌携带在,将要请求的业务接口中
  • 服务端校验客户端是否携带令牌与令牌是否过期

后端编码

  1. 开启接口幂等性校验
yue:
  redis:
    api-idempotent:
      enabled: true
  1. 在需要进行接口幂等性校验的接口加上@ApiIdempotent注解
@ApiIdempotent
@PostMapping("/test")
public Result<?> test(JSONObject paramJson) {
	return R.success(paramJson);
}

前端调用

  1. 请求获取version令牌

接口地址:GET /open/v2.3/apiIdempotent/getVersion

正确响应示例:

{
    "code": 200,
    "msg": "成功",
    "flag": true,
    "count": null,
    "data": "c4ac1fc37f3c44c2bc5f14fdbd0a1b27"
}
  1. 将获取到的version令牌,携带在需要幂等性验证的接口中请求
  • 如果前端未携带apiIdempotentVersion参数访问需要进行幂等性校验的接口时,会抛出幂等性错误提示
  • apiIdempotentVersion参数推荐放在header中
  • 一个令牌只能被使用一次

错误请求时的响应示例:

{
    "code": 600,
    "msg": "请勿重复操作",
    "flag": false,
    "count": null,
    "data": "【幂等性】幂等校验失败,apiIdempotentVersion 参数已失效,当前 value: 9b94ca639d3e49f489583a8719a637ac"
}

注解说明

@ApiIdempotent接口幂等性注解:

  • 被此元素注解的接口,表示需要进行幂等性校验
  • 前端请求被此元素注解的接口时,必须携带apiIdempotentVersion参数
  • apiIdempotentVersion参数值,需要调用getVersion接口预先获取,获得的值只可被使用一次

对比脚手架

yue-library正在计划提供属于自身的脚手架项目,但相比于单纯的脚手架项目,他更具有以下几点优势:

  • 简单易学:优雅的实现各个功能特性,并配备了完善的说明文档
  • 轻松引用:不同于脚手架,对于现有的SpringBoot项目也可以引入yue-library
  • 更易升级:以spring-boot-starter的方式提供支持,可随时跟进最新稳定版本
  • 无需维护:开发者只需专注自身业务逻辑实现,并熟练运用你所使用的特性
  • 灵活选取:你可以随时弃用yue-library保留SpringBoot原生使用

收藏一波以表支持吧(≧▽≦)/!

展开阅读全文
15 收藏
分享
加载中
更多评论
0 评论
15 收藏
分享
返回顶部
顶部