跳到主要内容

Api接口的最佳实现

阅读需 4 分钟

接口的最佳实现

接口的最佳实现

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等方式进行处理,

需要注意线程池的隔离。

14.控制接口中锁的粒度

锁定的范围尽量要小,保证性能。

15.避免大事务和长事务

涉及到Rpc调用的逻辑,不要放到事务中操作,使用编程式事务代替声明式事务。

大量数据写入时尽量使用批量写,避免大事务的产生。

16.接口的版本控制

保证系统的兼容性,特别是在多客户端版本下。

Loading Comments...