文章目录
- 前言
- 一、REST
- 二、GraphQL
- 三、gRPC(google Remote Procedure Calls)
- 四、Webhooks
- 五、服务端的事件发送——SSE(Server-sent Events)
- 六、EDI(Electronic Data Interchange)
- 七、面向API 的事件驱动设计
- 八、WebSocket
- 九、简单对象访问协议(SOAP)
- 十、Message Queuing Telemetry Transport(MQTT)
前言
在这个数字时代,我们的日常生活中充斥着各种应用程序和系统之间的交互。无论是社交媒体、在线购物还是智能家居设备,它们都需要通过API(应用程序接口)来实现数据的传输和通信。然而,这些看似简单的操作背后隐藏着复杂的协议。
API协议包含了一组规则和标准,用于定义不同系统之间如何进行通信和共享数据。它们充当了不同应用程序之间的桥梁,使它们能够相互理解和交流。API协议的设计和实现需要考虑到安全性、可靠性和效率等因素,以确保数据的准确传输和系统的正常运行。为了深入了解API的世界,这里对10个常见的API协议设计进行了梳理
一、REST
REST 是现代 web 开发中最流行的 API 开发技术。它为数据传输提供了一种无状态的体系结构。客户端请求包含满足请求所需的所有详细信息,而服务器不保留客户端的状态。
在RESTful API中,每个资源都可以通过唯一的URL进行标识和访问。客户端可以通过发送HTTP请求来执行各种操作,如获取资源、创建新资源、更新现有资源或删除资源。RESTful API的设计遵循一些基本原则,如资源的表达、客户端-服务器架构、无状态性和缓存等。REST API 支持本地 HTTP 缓存头,并使用 HTTP 方法(POST、 GET、 PUT、 PATCH 和 DELETE)来操作数据。任何人都可以很容易地开始使用 REST,很简单,而且学习曲线平滑。它还具有良好的可读性和可维护性,因为其使用标准的HTTP方法和状态码来表示不同的操作结果。
然而,RESTful API也有一些限制。由于其无状态性,每次请求都需要包含所有必要的信息,这可能会导致数据传输量较大。随着应用程序的扩展,端点的数量急剧增加,更新数据库模式或数据结构也并不容易。此外,对于复杂的业务逻辑,RESTful API可能不够灵活,需要额外的架构和设计来满足需求。
如果没有任何特定的需求,REST 是最好的选择。例如,如果是开发新手,那么使用 REST 是完美的匹配,因为它的学习曲线比较浅。此外,它还有一个很大的生态系统,可以很容易地找到任何问题的解决方案。另外,在处理许多请求和有限的带宽时,最好使用 REST。在这种情况下,可以使用其缓存支持来提高性能。
二、GraphQL
GraphQL 是2015年引入的一种数据查询语言。它允许开发人员精确定位并获取他们需要的确切数据。与 REST 相比,GraphQL 是一种客户端驱动的方法,客户端可以决定需要什么数据、如何获取数据以及格式。它还解决了取得过多和取得不足的问题,因为客户端可以精确定位所需的数据。
对于 API 而言,GraphQL 被视为一种新思路。GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时环境。GraphQL 对 API 中的数据提供了一套易于理解的完整描述,也让 API 更容易地随着时间推移而演进。GitHub 是使用 GraphQL 的最大公司之一。2016年,GitHub 从 REST 转向 GraphQL,极大地促进了 GitHub 的快速增长。关于 GraphQL 的介绍,网上已经有非常多的资料了,这里不再过多描述,具体可以参考 GraphQL.org。
在 GraphQL 中,类型系统用于描述 GraphQL Server 的能力并用于判断一个查询是否有效。类型系统还描述了查询参数的输入类型,并在 GraphQL Runtime 中检查参数值的有效性。一个 GraphQL 服务是通过定义类型和类型上的字段来创建的,然后给每个类型上的每个字段提供解析函数。例如,在 Github GraphQL Server 中,使用viewer字段来描述当前登录用户的信息,而viewer的类型为User。一旦启动某个 GraphQL Server,它就能接受 GraphQL 查询,并验证和执行该查询。GraphQL Server 首先会检查该查询以确保它只引用了已定义的类型和字段,然后运行指定的解析函数来生成结果。
与使用普通的 REST API 相比,强类型系统是 GraphQL 最吸引人的地方之一。GraphQL类型系统是其根基,所有人必须遵守,这就在大家对API接口描述形成统一认识上发挥着重要作用。在 GraphQL 中,GraphQL Runtime 确定 GraphQL Server 可以提供的能力,而消费端具体要获取哪些数据则完全由消费者说了算。客户端(消费端)可以以更加平等的地位,更加积极地参与到整个的数据交互过程。借助于GraphQL的类型系统,客户端可以更加自由地根据自己的需求来获得自己的所需,而无需受到 Server 端的限制。
GraphQL 不但改变了通信双方的话语权,还使得客户端可以精确地预测服务端的响应。GraphQL的不足之处在于查询可能很复杂,缺乏内置的缓存支持。与 REST 相比,学习 GraphQL 具有一定挑战性,并且默认情况下它不支持文件上传。
即便如此,在确定是否要使用 GraphQL 技术时,仍需要做认真的分析,且不可为了追新而采用 GraphQL。GraphQL 是查询具有多条记录的数据库的极佳选择。您可以使用 GraphQL 消除数据的额外读取,并且只检索特定格式的必要数据以提高应用程序性能。此外,GraphQL 非常适合于需要从多个资源聚合数据的情况。当不完全理解客户端如何使用 API 时,也可以使用 GraphQL。使用 GraphQL,不需要事先定义一个严格的契约。相反,可以根据客户端反馈逐步构建 API。
三、gRPC(google Remote Procedure Calls)
gRPC 是 Google 在2016年引入的开源远程过程调用(RPC)框架,使用 Protocol Buffers(protobuf)作为接口描述语言。它是一个轻量级的解决方案,并使用最少的资源提供最大的性能。
gRPC 遵循基于契约的通信方法。它要求客户机和服务器在开始通信之前都要有契约。GRPC 使用 Protobuf (一种声明性语言)创建契约,它使用选定的语言为客户机和服务器生成兼容的代码。gRPC 提供了多语言的支持,包括但不限于C++, Java, Python, Go, Node.js等。这使得开发者可以在不同的语言中构建相互兼容的服务和客户端。
gRPC 支持4种通信方式:
简单请求/响应:客户端向服务器发出单个请求,然后,服务器发送单个响应。
客户端流式通信:客户端向服务器发送一系列请求,然后发送消息通知服务器流已结束,最后,服务器发送一个响应。
服务器流式通信:客户端向服务器发出单个请求。然后,服务器向客户端发送一个消息流。
双向流式通信:gRPC 支持双向流,允许客户端和服务器之间同时发送多个消息。这种双向通信机制使得 gRPC 非常适合实时应用和流式数据处理。
gRPC 使用 HTTP/2 作为底层传输协议,带来了更高的性能和效率。HTTP/2 支持多路复用、头部压缩和二进制传输等特性,提高了通信的速度和资源利用率。它以二进制格式序列化数据,支持全双工通信,还能够进行负载平衡。gRPC 拥有丰富的生态系统,包括支持各种语言的库和工具。它还与 Kubernetes、Envoy、Istio等流行的开源项目集成,提供更全面的解决方案。
总体而言,gRPC 是一个强大而高效的 RPC 框架,适用于构建分布式系统、微服务架构和支持实时通信的应用程序。其设计理念注重性能、可扩展性和跨语言支持,使得它在现代应用开发中得到广泛应用。
四、Webhooks
Webhook是一种强大的技术,它可以实现系统之间的即时更新和通知。通过使用HTTP回调机制,Webhook能够确保各个系统之间的数据保持同步。
使用 Webhooks 时,一个应用程序(服务提供者)通常会提供一个注册接口,让另一个应用程序(服务消费者)注册感兴趣的事件。注册成功后,服务提供者将在相关事件发生时向服务消费者提供的回调地址发送 HTTP 请求,以触发相应的动作。
Webhook的工作原理很简单。当某个事件发生时,例如用户提交表单、发布新的文章或更新数据库,服务器会向预先定义的URL发送一个HTTP POST请求。这个URL可以是第三方应用程序的API端点,也可以是自己搭建的服务器。接收到请求后,服务器会执行相应的逻辑,并将结果通过HTTP响应返回给调用方。
通过这种方式,Webhook实现了系统之间的实时通信和数据同步。它消除了轮询和定期请求的需求,减少了网络流量和延迟。同时,Webhook还具有高度的可扩展性和灵活性,可以适应各种不同的应用场景。无论是开发电子商务网站、社交应用还是物联网设备,Webhook都是一个非常有用的工具。
五、服务端的事件发送——SSE(Server-sent Events)
SSE是一种基于HTTP的通信协议,它允许服务器向客户端推送实时更新的数据。与传统的轮询或长轮询不同,SSE通过建立持久的连接来实现数据的双向通信。一旦连接建立,服务器就可以通过该连接将数据推送到客户端,而无需客户端再次发起请求。例如,客户端首先发送一个HTTP GET请求到服务器,以建立持久的连接。然后,服务器会保持该连接打开,并随时将新的数据推送到客户端。客户端可以通过解析服务器发送的事件流来实时显示或处理这些数据。对基于Web的应用而言, 浏览器对SSE的支持如下:
由于SSE是基于HTTP协议的,因此它可以与各种编程语言和平台兼容。无论是JavaScript、Python还是Java,都可以通过相应的库或框架来使用SSE。此外,SSE还具有良好的可扩展性和性能优势,适用于处理大量的实时数据更新。
使用Server-Sent Events (SSE),可以体验到实时数据更新的便捷性,这种轻量级协议非常适合用于传输动态内容和即时信息。无论是开发实时聊天应用、新闻聚合网站还是监控仪表盘,SSE都是一个非常有用的工具。
六、EDI(Electronic Data Interchange)
Electronic Data Interchange(EDI)是一个用于交换商业文档的标准。它通过规范文档的结构和内容,使得不同系统之间能够更顺畅地交换业务信息, 也就是说,规范了API 通信内容的格式。通过使用𝗘𝗗𝗜标准,企业可以简化业务流程,提高自动化程度,并降低交易成本。
EDI可以通过API来实现互操作性。EDI将企业间的商业文档转换为标准的数据格式,这些数据格式转换为其他应用程序所需的数据格式。EDI可以将企业间的商业文档与企业内部的数据进行集成,而API可以将不同应用程序之间的数据进行集成,从而实现数据的共享和流通。EDI可以自动处理商业文档,通过API可以自动处理应用程序之间的数据交换和通信,从而实现业务流程的自动化。
对信息安全而言,EDI可以使用加密和数字证书等安全措施,而API可以使用访问控制和身份验证等安全措施,从而保障信息的安全性。同时I可以通过数据分析来实现数据的挖掘和分析。EDI可以将企业间的商业文档进行汇总和分析,并且以API将不同应用程序之间的数据进行汇总和分析,从而实现数据的挖掘和分析。
七、面向API 的事件驱动设计
“Event-Driven Architecture (EDA)” 指的是事件驱动架构,在API的领域中,表示为API而设计的事件驱动架构。
事件驱动架构强调系统中各个组件之间通过事件进行通信和协作。在这种架构中,组件可以是独立的服务、模块、或者整个系统。事件是系统中发生的事情,可能是状态变化、用户动作、外部触发等。当事件发生时,系统中的组件可以发布(或广播)该事件,同时对该事件感兴趣的其他组件可以订阅这些事件并做出响应。
Event-Driven Architecture 将事件驱动的思想应用于API设计和交互。这种架构风格在处理异步、分布式、和实时性要求较高的应用中非常有用。这一架构强调了通过事件的发布和订阅机制实现 API 组件之间的松散耦合。API 组件可以是生产者(发布事件的组件)或消费者(订阅并响应事件的组件)。DA使得 API 的通信变得异步化,允许组件在不直接等待响应的情况下继续执行。这有助于提高系统的性能和可伸缩性。
事件驱动的架构适用于需要实时性响应的场景,例如实时数据更新、通知推送等。通过事件分发机制,系统可以更即时地响应发生的变化。事件驱动的特性有助于微服务之间的通信和协作。一般地,API 网关可以充当事件的分发者,负责将事件发送到相应的订阅者。这有助于集中管理事件的流向和处理。通过使用事件来驱动 API 的交互,系统能够更好地适应动态变化和不同组件之间的异步通信需求。
八、WebSocket
WebSocket 实现了客户端和服务器之间的双向通信,为双方提供了一种实时而高效的交互方式。通过 WebSocket,客户端和服务器之间可以建立持久性的连接,使得双方可以在任何时候都能够发送和接收数据。这种双向通信机制极大地拓展了传统的请求-响应模型,为开发者提供了更灵活、更即时的交互手段。
WebSocket 协议通过在客户端和服务器之间创建一个持久性连接,允许双方通过单个socket进行实时通信。与传统的 HTTP 请求-响应模型不同,WebSocket 不需要在每次通信时都建立新的连接,从而减少了通信的开销和延迟。这对于实时应用程序、在线游戏、聊天应用等场景非常有益。
在 WebSocket 中,客户端和服务器之间的通信基于事件。一旦连接建立,任何一方都可以异步地发送消息给对方,而对方也能够立即接收并响应。这种实时的双向通信机制极大地提高了应用程序的交互性,使得用户能够在无感知延迟的情况下享受到更加流畅的应用体验。
总体而言,WebSocket 的引入使得 Web 应用程序在处理实时数据、推送通知和建立互动性方面取得了显著的进步。通过 WebSocket,客户端和服务器之间的双向通信成为现代 Web 应用中不可或缺的一部分,为开发者提供了更多创造性和实时性的可能性。
九、简单对象访问协议(SOAP)
SOAP 是 Web 服务的通信协议, 定义了 Web service 消息的格式。SOAP 编码用于告知 SOAP 运行时环境如何从 Java 等数据结构转化为 SOAP XML。
XML的可读性和可扩展性使得SOAP能够灵活地适应不同的应用场景,常见的 Web 服务规范包括:
Web 服务安全性(WS 安全性):通过叫做"令牌"的唯一标识符,实现消息安全防护和传输方式的标准化。
WS-Reliable Messaging:标准化了在不可靠的 IT 基础架构间传输消息的错误处理方式。
Web 服务寻址(WS 寻址):将路由信息打包为 SOAP 标头中的元数据,而不是在网络深处维护此类信息。
Web 服务描述语言(WSDL):描述 Web 服务的功能以及该服务的工作起点和终点。
SOAP 是协议独立的,可以在各种网络协议上运行,如HTTP、SMTP等。最常见的是在HTTP上使用SOAP,将SOAP消息封装在HTTP协议中进行传输。SOAP 和 WSDL 指示 Web 服务及其客户端之间的通信。SOAP支持多种消息交互模式,包括单向消息、请求-响应模式和异步消息。这使得它适用于不同的应用场景,从简单的数据查询到复杂的业务流程。
SOAP消息的传输可以使用安全协议,如HTTPS,以确保在网络上传输时的机密性和完整性。此外,SOAP还可以与其他安全标准(如WS-Security)结合使用,提供更高级的安全性支持。
十、Message Queuing Telemetry Transport(MQTT)
MQTT 是一种轻量级的、开放的消息队列传输协议,设计用于在低带宽、高延迟或不稳定网络环境中进行设备间通信。其设计注重资源效率,使其成为在受限环境中运行的设备和应用程序的理想选择。其协议头部较小,通信开销较小,适用于嵌入式系统和移动设备。
“ MQTT”中的“ MQ”是从 IBM 的 MQ (当时称为 MQSeries)产品线派生出来的,其中 MQ 代表“消息队列”。然而,尽管名称如此,该协议并不使用消息队列; 相反,它提供发布-订阅消息: 设备在特定主题上发布消息,所有订阅该主题的设备都接收该消息。它的主要应用包括向控制输出发送消息,以及从传感器节点读取和发布数据。
MQTT 提供不同的服务质量(Quality of Service,QoS)级别,以满足不同应用场景的需求。QoS级别包括至多一次(At most once)、至少一次(At least once)和只有一次(Exactly once)。
MQTT 支持持久性会话。客户端可以选择创建持久性会话,使得在客户端断开连接后,服务器能够保留其订阅信息。这有助于确保客户端在重新连接时能够接收到之前错过的消息。
MQTT 支持基本的身份验证和传输层安全性,但通常需要与其他安全机制结合使用,例如TLS/SSL。
总之,MQTT 是一种灵活、轻量级且易于实现的可靠而高效协议,特别适用于需要实时、可靠通信的物联网和嵌入式系统。