当前位置: 首页 > article >正文

后端接口设计

一、基本规范

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.超时及重试机制

根据实际需要,设置合理的超时时间可以避免用户长时间等待,提高用户体验,也有助于防止服务端因处理超时请求而耗尽资源,导致服务瘫痪。接口重试机制是指在接口请求失败时,按照一定的策略和次数重新发起请求的过程。在重试过程中,需要记录每次重试的日志信息,以便后续分析和排查问题。如果接口操作不具有幂等性,则需要谨慎使用重试机制,以避免产生副作用。


http://www.kler.cn/a/452324.html

相关文章:

  • Git--tag标签远程管理
  • 大数据-256 离线数仓 - Atlas 数据仓库元数据管理 正式安装 启动服务访问 Hive血缘关系导入
  • 【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
  • JAVAweb学习日记(三)Ajax
  • vue3 Proxy替换vue2 defineProperty的原因
  • GitPuk安装配置指南
  • 基于AT89C52单片机的6位电子密码锁设计
  • CPU性能优化--前端优化
  • 使用腾讯云CVM搭建 K8s + Docker + Harbor :部署SpringBoot应用与配置指南
  • 如何修改pip全局缓存位置和全局安装包存放路径
  • 使用Tauri + Leptos开发带系统托盘桌面应用
  • Spring Boot 整合 RabbitMQ:从入门到实践
  • Pytorch | 利用AI-FGTM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 准备考试:解决大学入学考试问题
  • springMVC-请求响应
  • 【数学建模】利用Matlab绘图(2)
  • linux 常用 Linux 命令指南
  • Linux大数据方向shell
  • 借助Aspose.html控件, 使用 Java 编程将 HTML 转换为 BMP
  • 基于java出租车计价器设计与实现【源码+文档+部署讲解】
  • ffmpeg之播放一个yuv视频
  • 常见问题解决方案:Keen CommonWeb 开源项目
  • CVPR-2024 | 具身导航模型大一统!NaviLLM:学习迈向具身导航的通用模型
  • Unity中如何修改Sprite的渲染网格
  • NFC 碰一碰发视频源码搭建技术详解,支持OEM
  • 从零用java实现 小红书 springboot vue uniapp (6)用户登录鉴权及发布笔记