接口相关内容

58 阅读4分钟

接口相关内容

统一封装接口返回信息

  • 例如

    data: Objectcode: 0message: 'success'
    }
    

接口参数校验

  • 简述

  • 校验与业务模块剥离,实现解耦的目的

  • 依赖

    <dependency>    
    	<groupId>org.springframework.boot</groupId>    
    	<artifactId>spring-boot-starter-validation</artifactId>
    </dependency>
    
  • 常用注解

    • @Valid
    • @Validated。可以与参数上的groups配合可以达到分组校验

国际化

  • 插件
    • Resource Bundle Editor
  • 配置
    1. 新建Resource Bundle
    2. 添加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)
  • 计数器

接口远程调用

Feign进行消费

原生Http请求

RestTemplate调用

RPC调用