接口相关内容
统一封装接口返回信息
-
例如
{ data: Object, code: 0, message: 'success' }
接口参数校验
-
简述
-
校验与业务模块剥离,实现解耦的目的
-
依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> -
常用注解
- @Valid
- @Validated。可以与参数上的groups配合可以达到分组校验
国际化
- 插件
- Resource Bundle Editor
- 配置
- 新建Resource Bundle
- 添加en_US和zh_CN3.在插件里面添加属性值(如:param.notEmpty)
统一异常处理
- 相关注解
- @ControllerAdvice
- @ExceptionHandler
- @ModelAttribute
- @InitBinder
接口多版本控制
方案
-
相同的URL,不同的版本参数,示例如下:
- domain/test?version=v1
- domain/test?version=v2
-
使用不同的子域名,示例如下:
- v1.test.com
- v2.test.com
-
不同的访问路径,通过网关进行路由,示例如下:
- domain/v1/test
- domain/v2/test
接口文档生成管理
相关技术
SwaggerV3(OpenAPI)
Knife4J
Knife4j的前身是swagger-bootstrap-ui
Smart-Doc
smart-doc在业内率先提出基于JAVA泛型定义推导的理念, 完全基于接口源码来分析生成接口文档,不采用任何注解侵入到业务代码中
Swagger与SpringFox的关系
- Swagger是一个遵循了OpenAPI规范的一项技术
- SpringFox是这项技术(Swagger)的具体实现方式
接口幂等性
简述
- 幂等原先是数学中的一个概念,表示进行1次变换和进行N次变换产生的效果相同
- 以相同的请求调用这个接口一次和调用这个接口多次,对系统产生的影响是相同的。如果一个接口满足这个特性,那么我们就说这个 接口是一个幂等接口
- 幂等性更多的是在重复请求已经发生,或是无法避免的情况下,采取一定的技术手段让这些重复请求不给系统带来副作用
常见场景
- 接口超时重试
- 消息重复消费
- 请求重发
标准Restful请求下,幂等性分析
- select(查询)
- GET、HEAD、OPTIONS都具备幂等性
- delete(删除)
- 不具备幂等性
- 影响的行数不同
- add/update(新增/修改)
- 不具备幂等性
保证幂等性的处理方式
数据库维度
- 悲观锁
- 例如for update
- 唯一ID、索引
- 使用主键进行约束,或者通过去重表唯一索引进行约束
- 主要用于处理新增类的操作
- 乐观锁
- 基于版本号、时间戳、状态
- 主要用于处理修改类的操作
分布式锁
-
token机制,流程如下:
1.客户端获取token 2.提交请求携带token 3.获取分布式锁 4.1成功 完成后续业务 释放锁,清除分布式锁 4.2失败 舍弃本次请求
防止重复提交
是不让用户发起多次一样的请求
通常是从客户端的角度来解决这个问题
- 处理方式
- 将按钮置灰
- 跳转到结果页
接口安全性
- AccessKey与SecretKey
- 这种设计一般用在开发接口的安全,以确保是一个合法的开发者
- 认证与授权
- 认证和授权,认证是访问者的合法性,授权是访问者的权限分级
- 包括对客户端的认证以及对用户的认证
- https加固
- 从接口传输安全的角度,防止接口数据明文传输
- 接口签名(加密)
- 主要防止请求参数被篡改。特别是安全要求比较高的接口,比如支付领域的接口
接口流控
场景
单例
- Guava RateLimiter
- AOP拦截自定义的RateLimit注解,在AOP使用Guava RateLimiter来进行流控。Guava RateLimiter提供了令牌桶算法实现,平滑突发限流(SmoothBursty)和平滑预热限流(SmoothWarmingUp)实现
集群/分布式
- redis+lua实现中的lua脚本
- 自定义实现或者使用ratelimiter-spring-boot-starter
- 使用Nginx+Lua实现的Lua脚本
- 使用 OpenResty 开源的限流方案
- 限流框架,比如Sentinel实现降级限流熔断
常见限流算法
- 令牌桶(Token Bucket)
- 漏桶(leaky bucket)
- 计数器