API设计的一点思路

Wesley13
• 阅读 768

API是模块或者子系统之间交互的接口定义。好的系统架构离不开好的API设计,而一个设计不够完善的API则注定会导致系统的后续发展和维护非常困难。

以下谈一点API设计的原则。

业务层

业务语义简单明确

一个接口或者说一个api,必定是为外部使用者服务的,因此必须具有明确的业务/使用意图。api的从命名到定义,都必须围绕着这个意图来进行设计,简单明确的命名/参数设计是一个好的api设计的第一步。

定义抽象,稳定,允许多个实现

API的设计需要注意的是,我们给出的api,实际上给出的是一个契约,由于业务实现/系统迭代的关系,内部的实现时常在变化的,但是契约的本质是没有变化的,因此我们定义api的时候,必须要进行一定程度的抽象,能够保证稳定的业务语义。最常见的方式就是,我这个api定义之后,如何方便的进行替换实现,并且外部的服务使用者是不感知我的变化的。

API定义的粒度

这里一个API的设计,至少需要保证原子服务的能力,但是很多情况下,服务调用方并不关心相关的原子服务能力,他所关心的是一个业务的处理。那么这个时候的情况下,我们的需要提供多个维度的api,使用门面模式进行原子能力的封装。

技术层

幂等

一个api的设计必须要进行幂等性设计,幂等性指的是多次的操作不影响第一次操作的结果;那我们常说的curd来说,Query接口具有天生的幂等性;Create多次调用的话容易存在重复创建,因此常用的做法是api设计有uk字段,显示或这个隐式的都可以,客户端必须要保证多次调用这个uk生成是唯一的;update进行幂等,常用的存在状态的话,会用乐观锁来进行校验,或者使用版本号的方式来进行判断;Delete的方式,其实delete多次调用不存在影响第一次调用的情况,只是会带来删除不存在的数据的一个错误提示的问题,这个可以和调用方进行约定,一定意义上,delete操作也是具有幂等性,无需做特殊的处理;

兼容

这个不用说了,api版本的升级,必须要考虑向下兼容;

批量处理

服务端是否提供批量处理的能力,这个一直是有争议的。我们先来看下服务端批量更新的优势和坏处,再根据具体的场景来选择是否进行服务端批量更新;

优势

1、性能的提升

一定程度上面可以进行性能的优化,比如我可以对批次数据进行划分,多线程进行处理,减少远程交互带来的网络开销等;

2、系统负载的转移

客户端的负载转移到服务端,服务端天生是需要进行这么多数据的处理,只是原先是在客户端进行流量的控制,甚至是批量的调用,现在转移到服务端进行批次处理了

3、客户端业务语义简化

批量处理,客户端不用关心一个业务聚合语义上面的数据的完整性和一致性,这部分交由服务端进行统一处理。客户端只需要关注数据结果,制定相关的重试策略即可。

劣势

1、带来了语义上的复杂性

全部成功,部分成功,全部失败,多种状态的处理,需要交由客户端进行处理,并且客户端很多情况下需要关注哪些成功,哪些失败,对于失败的数据需要明细的数据,这样就带来了接口语义的复杂性,丧失了api的简单的原则。

2、幂等处理的复杂性

如同上述,幂等处理需要考虑多数据之间的关联影响,部分成功处理的幂等性如何处理。

3、事务处理的复杂性

对于很多的客户端来说,一批次的数据不具有聚合关系,是允许存在数据状态不一致的(当然这种情况,可以将批量接口作为原子接口使用),并且由于实现的可替换性,是否支持批量的事务性这个需要进行考量

4、性能挑战

服务端实现批量处理,对于批次数据会对服务端带来性能上的挑战,并且不能对客户端进行约束,客户端滥用可能会导致性能问题的进一步恶化。

接口异常规范

需要具有比较粗力度的表示接口成功失败的字段,也有比较具体的明细信息,使用统一的异常码(常见并且精简的);

其他

API接口参数不要过多,不要具有相同参数类型参数,最好进行对象传递,进行防呆处理。

点赞
收藏
评论区
推荐文章
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
API网关原理
1、API网关介绍 API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。 API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有
liam liam
2年前
为什么越来越多的开发者放弃使用Postman,而选择Apifox
一、API调试常用解决方案1、PostmanSwaggerMockJMeter作为一个后端开发,我做的大部分项目一般都是基于Swagger来管理API文档,基于Postman来做接口调试,基于JMeter来做接口性能测试,基于RAP等工具MockAPI数据。\2、存在的问题(1)多系统数据不互通API设计者、前
liam liam
2年前
如何模拟后台API调用场景,很细!
简介在开发前后台分离项目并且通过不同团队来实现的时候,如何将后台设计的API准确的传达到前台,是一个非常重要的工作。为了简化这个过程,开源社区做了很多努力,比如protobuf技术,swagger的诞生,以及后面openapi的演化,都在试图解决API描述和文档的问题。这些标准某些程度上大大简化了API文档的撰写和维护,但是API设计往
菩提树神 菩提树神
1年前
最近收集大约200多个后台常用公开免费api接口 (调用完全不限次数)
随着互联网技术的不断发展,API(应用程序编程接口)已经成为了软件开发中不可或缺的一部分。API接口是不同软件之间进行数据交互和共享的重要途径,可以让不同的软件系统之间进行高效、快速、稳定的数据传输和处理。本文将介绍收集各种API接口的作用。一、API接口
liam liam
1年前
掌握 Swagger enum 的最佳实践指南
enum是规范中用来定义枚举类型的一种方式。它允许开发者在API文档中明确列出该接口的参数、返回值或请求体中可接受的枚举值。通过使用Swaggerenum,开发者可以更清晰地描述API的输入和输出,提高API文档的可读性和可维护性。enum使用场景在以下情
API 小达人 API 小达人
1年前
流程测试用例的详细指南|Eolink Apikit 接口自动化测试
流程测试用例是为验证特定业务流程而设计和编写的测试案例,专注于检查系统或应用程序在执行某一业务流程时的正确性、稳定性和可靠性。一个业务流程可能涉及多个步骤、多个用户交互和多个系统组件的协作,流程测试用例有助于确保整个流程在各种情况下都能正常运行。在API自动化测试中,所有的测试用例都是以项目维度来进行管理,一个自动化测试项目可以从多个API文档项目中引用API信息来创建API测试用例。
智多星V+TNY264278 智多星V+TNY264278
3个月前
两分钟教你如何高效的编写一个电商API接口?
一、需求分析首先要明确这个API接口的用途和要实现的功能。比如,是用于获取商品列表、用户订单信息,还是进行购物车操作等。例如,如果是创建一个获取商品列表的API,需要确定要返回的商品信息字段,如商品名称、价格、库存、图片链接等。二、设计数据结构数据库设计根
智多星V+TNY264278 智多星V+TNY264278
3个月前
开发API接口步骤
以下是开发API接口的一般步骤:一、需求分析明确API的用途和目标用户。例如,如果你要为一个电商平台开发API用于获取商品信息,那么目标用户可能是电商平台的合作伙伴、开发者或者内部的其他业务系统。确定需要提供哪些数据或功能。比如对于商品信息API,可能需要
高性能API网关Kong介绍
本文关键词:高性能、API网关、Kong、微服务1.Introduction是随着微服务(Microservice)概念兴起的一种架构模式。原本一个庞大的单体应用(Allinone)业务系统被拆分成许多微服务(Microservice)系统进行独立的维护和部署,服务拆分带来的变化是API的规模成倍增长,API的管理难度也在日益增加,使用API网关发布和管