后端接口设计
一、基本规范
1.URL设计
应遵循RESTful风格,使用动词+名词的方式描述接口的功能。应简洁明了,易于理解和记忆。
2.请求协议及方法
使用HTTPS协议进行数据传输,保证数据在传输过程中的安全性。如无特殊情况,统一使用post方法。
3.参数设计
参数命名应规范,具有描述性。参数类型、长度、范围等应明确。避免使用过多的嵌套参数,保持参数结构的简洁性。
4.响应格式
应统一返回格式,包括状态码、消息提示和数据体等。数据体中的字段命名、类型等应与请求参数保持一致。
二、安全性
1.身份验证
根据实际需要,通过token等方式进行身份验证。
2.权限控制
根据用户的角色和权限进行接口访问控制,防止未授权操作。
3.数据加密
对敏感数据进行加密传输,如密码、身份证号等。
4.数据脱敏
根据实际需要,对敏感数据(如身份证号)进行脱敏处理,防止数据泄露。
5.参数校验
对输入参数进行严格的校验和过滤,防止SQL注入攻击。
6.接口幂等性
同一个请求被发送多次时,对服务器资源的改变应是一致的。通常是在表单提交、创建订单、支付操作、数据同步等场景。为每次请求生成一个唯一的标识,并在服务器端进行校验。在执行操作前,先检查目标资源的状态。如果资源已经处于期望的状态,则不再执行操作。例如,在支付场景中,可以先检查订单是否已经支付成功,如果已经支付,则直接返回成功结果。在数据库层面或应用层面实现去重逻辑,确保相同的请求不会重复影响资源状态。例如,在插入数据时,可以使用数据库的唯一约束来防止重复插入。更新资源时,使用乐观锁机制(如版本号、时间戳等)来确保更新操作的原子性和一致性。当检测到版本冲突时,可以拒绝更新请求或提示用户重试。
7.IP白名单/黑名单
根据实际需要,限制特定IP地址的访问,提高安全性。
三、性能方面
1.缓存策略
使用缓存(如Redis)可以减少对数据库或其他资源的访问,提高接口响应速度。
2.限流控制
对接口进行限流,防止恶意攻击或突发流量导致系统崩溃。常用的限流算法有令牌桶、漏桶等。
3.异步处理
对于耗时较长的操作,如文件上传、数据计算等,可采用异步处理方式,提高接口的并发处理能力。
4.线程池隔离
核心接口和普通接口要进行线程池隔离。避免普通接口出现bug把线程池打满了,导致主业务受到影响。
5.控制锁粒度
在高并发场景下,为了防止超卖等情况,我们会对共享资源进行加锁的操作来保证线程安全的问题,但是如果加锁的粒度过大,是会影响到接口性能的。只需要在共享临界资源加锁即可,不涉及共享资源的,就不必要加锁。
6.避免长事务
长事务可能会占用数据库连接池资源,导致其他请求无法获取连接,同时还会锁定大量数据,造成阻塞和锁超时等问题。将大事务拆分为小事务,将非事务性操作与事务性操作分开,可以使用编程式事务(如TransactionTemplate)来手动控制事务的范围和提交时机。尽量避免在事务中进行远程接口调用(如RPC调用),因为这些调用可能会引入额外的延迟和不确定性。
四、可扩展性和兼容性
1.版本控制
通过请求头等方式进行接口版本控制,确保新旧版本接口的兼容性以及平滑过渡。
2.接口单一职责
每个接口应只负责一个功能点,保持接口的简洁性和可维护性。
3.可扩展性
在设计接口时,要考虑到未来的扩展需求,预留一定的扩展空间。
五、日志和错误处理
1.日志记录
记录接口请求日志,包括请求时间、请求参数、响应结果等,便于问题排查和性能分析。
2.统一错误码
定义清晰、统一的错误码,方便客户端识别和处理错误。
3.超时及重试机制
根据实际需要,设置合理的超时时间可以避免用户长时间等待,提高用户体验,也有助于防止服务端因处理超时请求而耗尽资源,导致服务瘫痪。接口重试机制是指在接口请求失败时,按照一定的策略和次数重新发起请求的过程。在重试过程中,需要记录每次重试的日志信息,以便后续分析和排查问题。如果接口操作不具有幂等性,则需要谨慎使用重试机制,以避免产生副作用。