API 接口选择那个?RESTful、GraphQL、gRPC、WebSocket、Webhook

大家好,我是比特桃。目前我们的生活紧紧地被大量互联网服务所包围,互联网上每天都有数百亿次API调用。API 是两个设备相互通讯的一种方式,人们在手机上每次指尖的悦动,背后都是 API 接口的调用。
在这里插入图片描述
本文将列举常见的一些 API 接口,并阐述它们之间的优缺点及关系。

目录

  • 一、API 类型
    • 1.1 SOAP
    • 1.2 RESTful
    • 1.3 gRPC
    • 1.4 GraphQL
    • 1.5 WebSocket
    • 1.6 Webhook
  • 二、RESTful 详解
  • 三、GraphQL 详解
  • 四、gRPC 详解
  • 五、API 优化
  • 六、总结

一、API 类型

常用的 API 类型有很多,但本文聚焦于 HTTP 之上的 API 接口(通用性)。像 TCP 传输层之上的其他应用层协议,如 MQTT 之类的,不在本文的讨论范围。
在这里插入图片描述

1.1 SOAP

SOAP 协议基于XML,应用于安全性和可靠性至关重要的金融服务和支付网关,比较适合对数据安全等级较高的场景。
在这里插入图片描述

1.2 RESTful

基于JSON的轻量级 web 服务,也是目前应用最广泛的 API 协议。
在这里插入图片描述

1.3 gRPC

高性能微服务通讯协议,它是微服务架构最爱。
在这里插入图片描述

1.4 GraphQL

一种客户端可动态定制化的 API 协议,它不仅仅是一种API通讯方式,还是一种查询语言。
在这里插入图片描述

1.5 WebSocket

WebSocket 是实时通讯的常用手段,基于HTTP协议。关于实时、双向和持久连接的。如果只需要服务器实时推送,也可以尝试同样基于 HTTP 的 SSE(Server-sent events)。
在这里插入图片描述

1.6 Webhook

自定义远程回调函数,通常用于自动化处理。我们在使用自动化部署 Jenkins 的时候有用到过:十分钟搞定Jenkins+Gitlab+Docker前后端部署
在这里插入图片描述
下面我们将详细介绍三个最常用的 API 接口:RESTful、GraphQL、gRPC。

二、RESTful 详解

RESTful API在移动互联网时代中有着广泛的应用,因为它足够的轻量(基于JSON),非常灵活。
在这里插入图片描述
REST API规定了许多标准,比如:统一接口、通讯方式、无状态、可缓存等。遵循 REST API 标准的 API 称为 Restful API,为了保障 API 接口的可维护性,一般开头会有 v1/v2/v3 这种类似的版本号。
在这里插入图片描述
需要注意的是,URL的资源是按名词来命名,而不是动词,比如你可以命名:

https://example.com/api/v3/products

而不是:

https://example.com/api/v3/getALLproducts

这也是很多不规范的“RESTful API”最容易犯错的地方,REST API 规定,动作是用 URI 进行的。
在这里插入图片描述
HTTP请求头的类型所对应的动作如下表所示,也是我们常说的:CRUD 增删改查:

类型动作
POSTCREATE
GETREAD
PUTUPDATE
DELETEDELETE

HTTP 常见的返回码对应的含义如下表所示:

数值结果
200成功
400请求错误
500后台错误

此外,还要注意 API 接口的幂等性问题。只有在进行 POST 创建操作的时候是不具备幂等性的,我们要注意客户端的多次请求,所导致的数据重复问题。

三、GraphQL 详解

Meta 公司开发的接口协议,目前 Github、Shopify、Ins 等均在使用。最大的特点就是灵活性和高效率,对于其产品有复杂数据要求的,提供了很好的选择方案。GraphQL 和我们刚刚说的 RESTful API 有很多相似之处,比如它们都是基于http、均通过 URL 进行统一资源定位、数据传输采用 JSON 格式。但GraphQL 独有的优势在于,客户端可定制化的选择接口返回的内容,这极大的提高了程序的动态扩展能力。
在这里插入图片描述
如果我们一个动作需要多个数据的组合,那在 RESTful API 中,可能面临多个请求。但在GraphQL中可以在请求头中进行数据定制,GraphQL 将组织好数据进行返回。
在这里插入图片描述
但它也有一定缺陷,一方面是不易进行缓存。GraphQL具有单一入口点,并且默认使用 HTTP POST,会妨碍 HTTP 缓存的充分利用。另一方面是因为可以随意自定义数据,这会可能会产生一些危险。

四、gRPC 详解

RPC 大家应该不算陌生,Remote Procedure Call 远程过程调用。也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法。由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

gRPC 是Google 2016年创建的开源远程过程调用框架,它重写了他们过年的内部RPC基础设施并开源出来。gRPC 是 RPC 的一种流行实现,许多组织已采用 gPRC 作为首选的 RPC 实现方案。还有Openfeign、Dubbo这种框架也可以作为 RPC 的实现方案。
gRPC生态系统的核心是使用 Protocal Buffers (协议缓冲区)作为其数据交换格式。它是一种和语言及平台无关的机制,用于编码结构化数据。
在这里插入图片描述
gRPC 使用 Protocal Buffers 进行编码并通过线路发送数据。虽然gRPC也可以通过 JSON,但Protocal Buffers 提供了多种优势,使其成为 gRPC 的首选编码格式。通过定义通讯协议 proto 文件,来让微服务之间进行通讯,写好 proto 后可以通过工具自动生成不同语言的实现:
在这里插入图片描述
之所以 gRPC 具有超高的性能,Protocol Buffers 的通讯方案是重点。它是一种非常高效的二进制编码格式,比 JSON 快得多。
在这里插入图片描述
另一个高效率的原因是,gRPC 构建在HTTP/2 之上,以提供大规模的高性能基础。gRPC使用 HTTP/2 Stream,它允许通过单个长期的TCP连接发送多个消息流。HTTP/2 的好处有:多路复用、流优先、二进制协议、服务推送。当然,Openfeign也可以通过配置使用 HTTP/2。
在这里插入图片描述
gRPC由于二进制编码和网络优化,效率很高,比JSON快5倍。下图为 gRPC 通讯的过程:
在这里插入图片描述
说了这么多 gRPC 的好处,那为什么服务端在与客户端通讯的时候没采用 gRPC 协议呢?这是因为gRPC依赖于对HTTP/2原生较低级别的访问,目前没有浏览器支持 gRPC 客户端所需的网络请求控制级别。
不过目前可以在代理的帮助下从浏览器进行 gRPC 调用。这项技术被称为 gRPC-Web。但是该功能集并不能与 gRPC 完全兼容。但在移动端其实有在使用,在电量和带宽受限的环境中非常有意义。
在这里插入图片描述

五、API 优化

  • 使用缓存,可以采用类似 Redis 这种工具,将数据进行缓存以提供高效率的通讯。
  • 连接池,使用多路复用技术,用来减少对数据库的访问。
  • 避免 N+1 查询,当一个接口需要采用多个 SQL 语句的时候,尝试组合使用一个。
  • 使用分页,减少数据通讯的代价,换取更快的加载速度。
  • 采用 JSON,轻量级的 JSON 通讯可以在服务端与客户端中保持平衡。
  • 压缩,可以用 Brotli 算法对数据进行压缩,许多CDN(内容分发网络)也可以支持压缩。
  • 异步日志记录,当高并发的时候,这类工作可以分发到别的微服务中进行。

六、总结

本文我们了解了基于 HTTP 应用层协议之上的,常用六种 API 接口:RESTful、GraphQL、gRPC、WebSocket、Webhook。每一个都具有自己鲜明的特色及应用场景,我们应该根据产品以及团队的具体情况才选择使用。没有最好的 API 接口,只有最适合的场景及应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/100857.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

element-ui中二次封装一个带select的form组件

带select的form组件 样式 代码 <template><el-form-item label"是否有" class"append" prop"tag"><el-form-itemprop"isShare"><el-select v-model"query.tag"><el-option v-for"(item, …

2023国赛数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

4.物联网LWIP之C/S编程,实现服务器大小写转换

LWIP配置 服务器端实现 客户端实现 错误分析 一。LWIP配置&#xff08;FREERTOS配置&#xff0c;ETH配置&#xff0c;LWIP配置&#xff09; 1.FREERTOS配置 为什么要修改定时源为Tim1&#xff1f;不用systick&#xff1f; 原因&#xff1a;HAL库与FREERTOS都需要使用systi…

错题整理——测开2021网易

1. 某些bug不影响使用时&#xff0c;可以选择先上线&#xff0c;在维护过程中修复。 2. df&#xff1a;查看磁盘使用情况 dir不是linux的常用的命令&#xff0c;不过用dir能够罗列出目录内容&#xff1b;dir默认没有颜色的区别&#xff0c;但也可以设置。现在都使用ls来代替。…

微信小程序卡片横向滚动竖图

滚动并不是使用swiper&#xff0c;该方式使用的是scroll-view实现 Swiper局限性太多了&#xff0c;对竖图并不合适 从左往右滚动图片示例 wxml代码&#xff1a; <view class"img-x" style"margin-top: 10px;"><view style"margin: 20rpx;…

三种生成树(STP,RSTP,MSTP)的基本配置(自我理解)

目录 一、为什么要使用生成树&#xff08;STP)&#xff1a; 二、由于设备冗余而导致的问题&#xff1a; 广播风暴&#xff1a; 三、802.1D生成树基本配置 四、802.1D生成树实验 实验拓扑&#xff1a; 实验配置&#xff1a; 配置完成后&#xff0c;在SW8上观察现象&…

RedisDesktopManager 连接redis

redis查看是否启动成功 ps -ef | grep redis以上未启动成功 cd /usr/local/bin/ 切换根目录 sudo -i 开启服务端 ./redis-server /usr/local/redis/redis.conf 开启客户端 ./redis-cli

JUC--阻塞队列

目录 问题引出 一.单端阻塞队列&#xff08;BlockingQueue&#xff09; 二.双端阻塞队列&#xff08;BlockingDeque&#xff09; 三.延迟队列&#xff08;DelayQueue&#xff09; 问题引出 由于实现消费者-生产者模型&#xff0c;每一次实现都比较麻烦&#xff0c;比如sych…

Python批量爬虫下载文件——把Excel中的超链接快速变成网址

本文的背景是&#xff1a;大学关系很好的老师问我能不能把Excel中1000个超链接网址对应的pdf文档下载下来。虽然可以手动一个一个点击下载&#xff0c;但是这样太费人力和时间了。我想起了之前的爬虫经验&#xff0c;给老师分析了一下可行性&#xff0c;就动手实践了。    没…

4.SpringCloud 基本架构

1.SpringCloud概述 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff0c;一次性令牌&#xff0c;全局锁&#xff0c;…

测试框架pytest教程(2)-用例依赖库-pytest-dependency

对于 pytest 的用例依赖管理&#xff0c;可以使用 pytest-dependency 插件。该插件提供了更多的依赖管理功能&#xff0c;使你能够更灵活地定义和控制测试用例之间的依赖关系。 Using pytest-dependency — pytest-dependency 0.5.1 documentation 安装 pytest-dependency 插…

【源码篇】ThreadLocal源码解析(主打的就是通俗易懂,言简意赅)

文章目录 ThreadLocal学习笔记前言1、TheadLocal基本介绍2、ThreadLocal基本使用3、体验ThreadLocal的优点3.1 ThreadLocal与synchronized的比较3.2、ThreadLoca的应用场景 4、ThreadLocal的内部原理4.1 ThreadLocal内部结构4.2 ThreadLocal常用方法分析4.2.1 set原理分析4.2.2…

云计算在IT领域的发展和应用

文章目录 云计算的发展历程云计算的核心概念云计算在IT领域的应用1. 基础设施即服务&#xff08;IaaS&#xff09;&#xff1a;2. 平台即服务&#xff08;PaaS&#xff09;&#xff1a;3. 软件即服务&#xff08;SaaS&#xff09;&#xff1a; 云计算的拓展应用结论 &#x1f3…

学习maven工具

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f3e8;maven工具产生的背景&#x1f993;maven简介&#x1fa80;pom.xml文件(project object Model 项目对象模型) &#x1fa82;maven工具安装步骤两个前提&#xff1a;下载 m…

合宙Air724UG LuatOS-Air LVGL API--简介

为何是 LVGL LVGL 是一个开源的图形库&#xff0c;它提供了创建嵌入式 GUI 所需的一切&#xff0c;具有易于使用的图形元素、漂亮的视觉效果和低内存占用的特点。 LVGL特点&#xff1a; 强大的 控件 &#xff1a;按钮、图表、列表、滑动条、图像等 高级图形引擎&#xff1a;动…

[Docker] Portainer + nginx + AList 打造Docker操作三板斧

Portainer : Docker容器图形化管理系统 nginx: 反向代理利器 AList: 文件管理系统 目的: 依托Portainer 的图形管理界面,可视化的配置docker容器. AList再关联Docker各容器内部的配置文件,可视化配置,再配合Portainer重启,日志查看,命令行操作等.对于中小企业对容器化操作简…

ECharts配合Node.js爬虫实现数据可视化

数据可视化简介 可视化技术是将数据和信息以图形化的方式展示出来&#xff0c;以便更好地理解和分析。可视化技术通常使用各种图表、图形、动画和交互式效果来呈现数据。可视化技术有以下几个基本概念&#xff1a; 数据&#xff1a;可视化技术的基础是数据。数据可以是数字、文…

探索软件项目管理的本质及概念

什么是软件项目管理&#xff1f; 软件项目管理是指对软件项目从规划、组织、指挥、控制到最终交付的全过程进行有效管理的一种方法。它通过合理的资源分配、有效的沟通和高效的协作&#xff0c;确保软件项目能够按照预定的目标、时间和质量要求完成。在现代信息技术逐渐普及和…

rabbitmq的发布确认

生产者将信道设置成 confirm 模式&#xff0c;一旦信道进入 confirm 模式&#xff0c; 所有在该信道上面发布的 消息都将会被指派一个唯一的 ID (从 1 开始)&#xff0c;一旦消息被投递到所有匹配的队列之后&#xff0c;broker 就会发送一个确认给生产者(包含消息的唯一 ID)&…

科技云报道:云计算下半场,公有云市场生变,私有云风景独好

科技云报道原创。 大数据、云计算、人工智能&#xff0c;组成了恢弘的万亿级科技市场。这三个领域&#xff0c;无论远观近观&#xff0c;都如此性感和魅力&#xff0c;让一代又一代创业者为之杀伐攻略。 然而高手过招往往一瞬之间便已胜负知晓&#xff0c;云计算市场的巨幕甫…