接口的最佳实现
接口的最佳实现
1.接口参数的合法性验证
过滤掉无效请求,提高接口的稳定性
常规验证可以使用Validation校验,业务验证在业务代码中自行判断。
2.关键接口的日志打印
关键接口的日志必须要保留,并且保证日志级别以及敏感信息的记录。
3.接口的幂等性
无论接口调用多少次,结果始终一致,在分布式接口重试的机制下尤为重要
Select是天然幂等的,Delete在没有下游操作时也是幂等的。
Create是非幂等的,每次操作都会产生数据,可以使用业务唯一id防止客户端重试下的数据重 复
Update更新的逻辑是幂等的,但是涉及到计数之类的操作则不是幂等的
4.接口限流的控制
开放给三方的接口需要严格的限流控制,防止因第三方的BUG导致的流量暴增。
本机单服务限流可以使用Aop,分布式多集群服务可以使用Redis+Lua的方式实现全局限流。
5.数据的脱敏处理
在返回Response的时候可以通过Aop的方式,将身份证号,银行卡号,手机号等数据脱敏。
或者在序列化反序列化的时候进行处理
6.接口的身份验证和鉴权操作
通过Token对用户身份进行验证,保证接口的安全性
7.对第三方接口的重试,超时,异常处理
调用第三方接口时的超时,异常,重试处理,保证接口不卡顿,同时记录日志,调用失败时考虑是否进行重试
8.返回统一格式的响应结构
code,message,data的结构,方便客户端对响应数据的处理
9.接口的单一职责
一个接口不能承载多个不同的功能,应该聚焦某一个特定的功能模块。
10.接口应按需要进行异步处理
主要业务非异步,完成后返回响应,后续业务可以进行异步处理,如登陆成功后的发送邮件等,不影响主业务的流程。
可以使用异步线程池,或者消息队列。
11.核心接口的线程池隔离
不同的核心接口使用不同的线程池,避免因一个接口的阻塞影响到其他核心接口。
可以创建多个Bean,创建多个线程池。
@Bean(name = "orderThreadPool")
public Executor orderThreadPool(){
...
}
@Bean(name = "userThreadPool")
public Executor userThreadPool(){
...
}
12.降低接口响应时间
大数据量下采用分页的方式,分批次返回数据。
数据库一定要使用索引,同时考虑使用缓存等机制(本地,Redis,Es,Mongo,Cdn)
负载均衡技术
13.接口串行处理改为并行处理
多个查询操作在互不关联的情况下可以采用并行处理,使用CompletableFuture等方式进行处理,
需要注意线程池的隔离。