这是一系列文章的延续,我在其中简要介绍了系统架构设计中特定主题的要点。第一篇文章可以在这里阅读
API 架构是指规定软件组件如何交互的一组规则、协议和工具。 API 的架构不仅仅在于促进通信,还在于促进通信。它还涉及确保这种通信高效、安全和可扩展。
设计良好的 API 架构可以显着提高系统的性能,而设计不当的 API 架构可能会导致瓶颈、安全漏洞和维护噩梦。
最常见的API设计风格:
REST (表述性状态传输)是最常用的风格,它使用标准方法和 HTTP 协议。它基于无状态、客户端-服务器架构和可缓存性等原则。它通常用于前端客户端和后端服务之间。
GraphQL是一种 API 查询语言。与 REST 不同,REST 为每个资源公开一组固定的端点,GraphQL 允许客户端准确请求他们需要的数据,从而减少过度获取。
WebSocket是一种允许通过 TCP 进行双向通信的协议。客户端使用网络套接字从后端系统获取实时更新。
Webhook是一种允许一个系统实时通知另一个系统有关特定事件的机制。它是用户定义的 HTTP 回调。
RPC (gRPC)是一种协议,一个服务可以使用该协议向网络中另一台计算机上的服务请求过程/方法。通常,它是为低延迟、高速通信而设计的。
SOAP是一种用于交换结构化信息以实现 Web 服务的协议。它依赖于 XML,并以其稳健性和安全特性而闻名,目前被认为是遗留协议。
让我们分别看看每个协议的优点、缺点和用例。
REST是一种使用标准约定和协议的架构风格,使其易于理解和实现。它的无状态特性和对标准 HTTP 方法的使用使其成为构建基于 Web 的 API 的流行选择。
虽然 REST 长期以来一直是构建 API 的事实上的标准,但 GraphQL 等其他风格也已经出现,为查询和操作数据提供了不同的范例。
格式:XML、JSON、HTML、纯文本
传输协议:HTTP/HTTPS
资源:在 REST 中,一切都是资源。资源是一个对象,具有类型、关联数据、与其他资源的关系以及一组对其进行操作的方法。资源由其 URI(通常是 URL)标识。
CRUD 操作:REST 服务通常直接映射到资源上的 CRUD(创建、读取、更新、删除)操作。
HTTP 方法:REST 系统使用标准 HTTP 方法:
GET:检索资源。
POST:创建新资源。
PUT/PATCH:更新现有资源。
删除:删除资源。
状态代码:REST API 使用标准 HTTP 状态代码来指示 API 请求的成功或失败:
500内部服务器错误
501 - 未实施
502错误的网关
503服务不可用
504网关超时
无状态:从客户端到服务器的每个请求都必须包含理解和处理该请求所需的所有信息。服务器不应在请求之间存储有关客户端状态的任何信息。
客户端-服务器:REST 基于客户端-服务器模型。客户端负责用户界面和体验,而服务器负责处理请求、处理业务逻辑和存储数据。
可缓存:来自服务器的响应可以由客户端缓存。服务器必须指示响应是否可缓存。
分层系统:客户端通常无法区分它是直接连接到终端服务器还是中介。中间服务器可以通过启用负载平衡和提供共享缓存来提高系统的可扩展性。
HATEOAS:超媒体作为应用程序的引擎 Stat 是一种 REST Web 服务原则,使客户端能够完全基于服务器在其响应中动态提供的超媒体与 Web 应用程序进行交互和导航,从而促进松散耦合和可发现性。
要求
获取“/用户/42”
回复
{ "id": 42, "name": "Alex", "links": { "role": "/user/42/role" } }
GraphQL提供了一种更灵活、更强大、更高效的 API 构建方法,特别是在复杂的系统中或当前端需要高度灵活性时。它将部分责任从服务器转移到客户端,允许客户端指定其数据要求。
虽然它不能在所有场景中替代 REST,但它在许多情况下提供了令人信服的替代方案,特别是当应用程序变得更加网络化和分布式时。
格式:JSON
传输协议:HTTP/HTTPS
要求
GET “/graphql?query=user(id:42){ 名称角色 { id 名称 } }”
回复
{ "data": { "user": { "id": 42, "name": "Alex", "role": { "id": 1, "name": "admin" } } } }
WebSockets通过单个长期连接提供全双工通信通道,允许客户端和服务器之间进行实时数据交换。这使其成为交互式和高性能 Web 应用程序的理想选择。
格式:二进制
传输协议:TCP
要求
获取“ws://site:8181”
回复
HTTP/1.1 101 切换协议
Webhook是由特定Web应用程序事件触发的用户定义的HTTP回调,允许实时数据更新和不同系统之间的集成。
格式:XML、JSON、纯文本
传输协议:HTTP/HTTPS
要求
获取“ https://external-site/webhooks?url=http://site/service-h/api&name=name ”
回复
{ "webhook_id": 12 }
RPC (远程过程调用)是一种协议,允许程序在另一个地址空间执行过程或子例程,从而实现分布式系统之间的无缝通信和数据交换。
gRPC (Google RPC) 是一个建立在 RPC 之上的现代开源框架,使用 HTTP/2 进行传输,使用 Protocol Buffers 作为接口描述语言,提供身份验证、负载平衡等功能,以促进高效、稳健的通信微服务之间。
格式:JSON、XML、Protobuf、Thrift、FlatBuffers
传输协议:各种
要求
{ "method": "addUser", "params": [ "Alex" ] }
回复
{ "id": 42, "name": "Alex", "error": null }
格式:协议缓冲区
传输协议:HTTP/2
message User { int id = 1 string name = 2 } service UserService { rpc AddUser(User) returns (User); }
SOAP (简单对象访问协议)是一种用于交换结构化信息以在计算机网络中实现 Web 服务的协议。它是一种基于 XML 的协议,允许运行在不同操作系统上的程序相互通信。
格式:XML
传输协议:HTTP/HTTPS、JMS、SMTP 等
基于 XML :SOAP 消息采用 XML 格式并包含以下元素:
故障:可选的故障元素,提供有关处理消息时发生的错误的信息。
中立性:SOAP 可以与任何编程模型一起使用,并且不依赖于特定的模型。
要求
<?xml version="1.0"?> <soap:Envelope> <soap:Body> <m:AddUserRequest> <m:Name>Alex</m:Name> </m:AddUserRequest> </soap:Body> </soap:Envelope>
回复
<?xml version="1.0"?> <soap:Envelope> <soap:Body> <m:AddUserResponse> <m:Id>42</m:Id> <m:Name>Alex</m:Name> </m:AddUserResponse> </soap:Body> </soap:Envelope>
API 架构风格多种多样,提供了各种方法,如 REST、SOAP、RPC 等,每种方法都有独特的优势和用例,使开发人员能够选择最合适的范例,在不同软件之间构建可扩展、高效和强大的集成组件和系统。