前言
接口设计开发是后端日常开发中基础且重要的一个环节。为了设计好一个接口,需要考虑哪些问题?这里分享一些个人观点,欢迎一起讨论。
参数校验
接口的入参都需要提前进行校验。校验入参的类型、是否能为空,是否符合长度限制,是否有格式限制,如邮箱,网址等。
- 接口校验的意义?
- 校验本身是种对字段属性依赖的显式声明
- 从快速失败原则看,越早失败越容易排查问题。提前抛出异常,避免不需要的逻辑计算,节省资源,同时也方便对捕捉的异常进行处理。
- 不校验会有什么问题?
- 导致未知bug。当接收的数据不符合预期,且这些数据又是被依赖的对象,则会导致各种非预期的情况。
- 示例:
- 长度过长,导致数据库存储失败
- 类型不符合预期,可能导致逻辑运算等各种错误
接口规范
设计高一致性的接口,让接口可读性更好,减少沟通成本,提高可维护性。
- 保持接口一致性的方式?
- 字段命名统一规范
- 返回统一的结构
- 响应码:提前定义好响应码的含义
- 提示信息
- 返回值:是否为空,如果为空的时候是否返回默认值。
接口拓展性
确保接口的实现的灵活性和兼容性。为后续的需求变化,预留拓展空间。
- 灵活性:模块化和可重用。对接口逻辑进行抽象,设计成可重用的类或方法。抽象接口用统一接口处理一类事情,如:获取各种枚举值列表、发送各类消息通知接口、对象存储接口等。
- 兼容性:新接口兼容旧接口,实现向后兼容。设计URL时引入版本号,方便版本控制。
接口幂等性
关键接口需要实现幂等性,以此提高系统的容错和可靠性。比如支付接口,肯定需要防止一个订单多次支付情况。
- 幂等性是什么?
在编程中一个幂等操作的特点是其多次执行所产生的影响均与一次执行的影响相同。 这个概念源于抽象代数,之后被应用于计算机领域。如:取绝对值,两次取反,取整运算等都是幂等操作。
- 应用场景?
分布式系统、网络通讯和数据库操作领域中,容易出现中断、错误恢复和重试的操作场景。
- 如何实现幂等性?
除了使用HTTP中的幂等性请求方法(如GET、PUT、DELETE)外,可以使用唯一标识符、幂等性Token等
接口日志打印
- 合理地记录程序运行日志,是开发人员排查问题的关键。
- 日志就像汽车保险,没问题时不想为之买单,出问题了则变成救命稻草。相对后果,投入一些成本是划算的。
- 程序运行日志记录的是非预期的行为和异常情况。
- 那该如何打印日志?
推荐一位大佬的文章:日志的艺术:www.cnblogs.com/xybaby/p/79…
接口优化
接口优化可以提升系统的性能、可靠性和用户体验,从而更好地满足用户的需求。
- 优化接口响应速度的常见方式有?
- 缓存: 使用缓存技术来存储接口的计算结果或数据,以避免重复计算或查询数据库。常见的缓存方案包括内存缓存、分布式缓存和CDN(内容分发网络)等。
- 异步处理: 将耗时的操作(如IO操作、网络请求、计算密集型任务)转移到后台线程或者异步任务队列中处理,以避免阻塞主线程,提高接口的响应速度。
- 使用索引: 在数据库中使用索引来加速查询操作,特别是对于频繁使用的查询字段和排序字段。合理设计索引可以大幅提高数据库查询的效率。
- 并行处理: 将接口的处理任务分解为多个并行的子任务,并行处理这些子任务,以提高接口的处理效率和吞吐量。
- 控制锁的颗粒度: 避免长事务锁,只锁住最少且必要的共享资源。
安全
接口安全的是保护系统和用户的数据安全的基础
- 常见的措施有?
- 对高频接口设置限流
- 对接口进行身份认证和鉴权
- 为了防止SQL注入,使用预处理语句。或者使用ORM继续数据库操作。