当前位置: 首页 > news >正文

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 接口,只有最适合的场景及应用。

相关文章:

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

大家好,我是比特桃。目前我们的生活紧紧地被大量互联网服务所包围,互联网上每天都有数百亿次API调用。API 是两个设备相互通讯的一种方式,人们在手机上每次指尖的悦动,背后都是 API 接口的调用。 本文将列举常见的一些 API 接口&…...

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg,方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…...

软考高级架构师下篇-12层次式架构设计理论与实践

目录 1. 考情分析2. 层次式体系结构概述3. 表现层框架设计4. 中间层框架设计5. 数据访问层设计6. 数据架构规划与设计7. 物联网层次架构设计8. 前文回顾1. 考情分析 根据考试大纲,层次式架构设计理论与实践知识点会涉及单选题型(约占2~5分)和案例题(25分),本小时内容偏重于方…...

234. 回文链表

234. 回文链表 给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* L…...

LInux之例行工作

目录 场景 单一执行例行任务 --- at(一次性) 安装 命令详解 语法格式 参数及作用 时间格式 案例 at命令执行过程分析 循环执行的例行性任务--crontab(周期性) crontd服务安装 linux 任务调度的工分类 crontab工作过程…...

C++,从“hello world“开始

一、"hello world" #inclue <iostream>using namespace std;int main() {cout << "hello world" << endl;return 0; } 1.1 #include&#xff1a;预处理标识 1.2 <iostream>&#xff1a;输入输出流类所在头文件 1.2.1 istream&a…...

/root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘+ssh-rsa‘.

文章目录 1、问题2、查看openssh版本3、解决问题4、重新生成密钥5、查看是否可连接工蜂 1、问题 ssh访问工蜂报错&#xff1a; [rootlocalhost .ssh]# ssh -T gitgit.code.tencent.com /root/.ssh/config line 2: Bad protocol 2 host key algorithms ‘ssh-rsa’. 2、查看o…...

mac m1上系统内录内部声音的方法/无需安装Blackhole

总所周知&#xff0c;m1的mac不能录制桌面音频&#xff0c;obsstudio都不行。 最快的解决方法就是下载飞书&#xff1a; 登陆后新建直播/视频会议&#xff1a; 共享的时候选择下面的两个钩上去就好了...

数字人学习目录

数字人学习目录 百度PaddlePaddleHub图像风格迁移模型pp-tinypose模型 PaddleGANPaddleLitePaddleDetectionPP-TinyPose 人体骨骼关键点识别 PaddleSpeechVisualDLPaddleBobo TransformerWav2LibCLIPFFMpeg模型库数据集学习天地PythonJupyter Notebook Unity3DUE 百度Paddle P…...

PHP 房产网站系统Dreamweaver开发mysql数据库web结构php编程计算机网页项目

一、源码特点 PHP 房产网站系统是一套完善的WEB设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 源码 https://download.csdn.net/download/qq_41221322/88233553 论文 https://download…...

0基础入门代码审计-2 Fortify初探

0x01 序言 目前又加入一位新童鞋了&#xff0c;最近将会再加入cs相关的专栏&#xff0c;都是以基础为主&#xff0c;毕竟太复杂的东西&#xff0c;能看懂的人太少。 0x02 准备工具 1、Fortify 2、需要审计的源码 0x03 Fortify的简单使用 1、 1、在开始菜单栏中找到Audit Wo…...

qiiuzhiji4

本篇是从慧与离职后到2023年8月21日这段时间的经历 2023/7/31至2023/8/21 本篇初次写于2023年8月21日 从慧与离职后基本上就是在专心找工作了&#xff0c;但是有在这段时间找工作经历的人都明白&#xff0c;IT行业不复以往了。尤其是对于我这样的普通二本学历的人来说&#xff…...

构建 NodeJS 影院微服务并使用 docker 部署【01/4】

图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站&#xff0c;需要Docker、NodeJS、MongoDB&#xff0c;这样的案例您见过吗&#xff1f;如果对此有兴趣&#xff0c;您就继续往下看吧。 在本系列中&#xff0c;我们将构建一个 NodeJS 微服务&#xff0c;并使用…...

变频器和plc之间无线MODBUS通讯

在工业现场由PLC远程控制变频器的应用非常常见&#xff0c;如果挖沟布线不便或者变频器在移动设备上&#xff0c;那么采用无线通讯就是最佳方案。 这里我们选用最常用的三菱 FX2N PLC和三菱变频器为例&#xff0c;并结合日系plc专用无线通讯终端DTD435M来说明PLC与变频器之间的…...

【云原生】3分钟快速在Kubernetes1.25部署Prometheus2.42+Grafana9.5.1+Alertmanager0.25

文章目录 1、简介2、GitHub地址3、环境信息4、安装5、访问Grafana1、简介 Prometheus-operator帮助我们快速创建Prometheus+Grafana+Alertmanager等服务,而kube-prometheus更加完整的帮助我们搭建全套监控体系,这包括部署多个 Prometheus 和 Alertmanager 实例, 指标导出器…...

Redis中常见的缓存穿透、缓存击穿、缓存雪崩、缓存预热解决方案

文章目录 一、缓存穿透1. 什么是缓存穿透2. 解决方案2.1 无效的key存放到Redis2.2 引入布隆过滤器2.3 如何选择&#xff1a; 二、缓存击穿1. 什么是缓存击穿2. 解决方案 三、缓存雪崩1. 什么是缓存雪崩2. 解决方案2.1 均匀过期2.2 热点数据缓存永远不过期2.3 采取限流降级的策略…...

第二章-自动驾驶卡车-自动驾驶卡车前装量产的要求

1、自动驾驶卡车的特点与挑战 重卡主要运行在相对封闭的高速公路&#xff0c;相较城市道路场景看似更简单。但是&#xff0c;由于重卡特有的物理特性、运行环境和商业运营要求&#xff0c;相较于乘用车的自动驾驶系统&#xff0c;重卡的自动驾驶系统对车辆的感知距离和精度、系…...

Midjourney API 申请及使用

Midjourney API 申请及使用 在人工智能绘图领域&#xff0c;想必大家听说过 Midjourney 的大名吧&#xff01; Midjourney 以其出色的绘图能力在业界独树一帜。无需过多复杂的操作&#xff0c;只要简单输入绘图指令&#xff0c;这个神奇的工具就能在瞬间为我们呈现出对应的图…...

mysql mysql 容器 忽略大小写配置

首先能够连接上mysql&#xff0c;然后输入下面这个命令查看mysql是否忽略大小写 show global variables like %lower_case%; lower_case_table_names 0&#xff1a;不忽略大小写 lower_case_table_names 1&#xff1a;忽略大小写 mysql安装分为两种&#xff08;根据自己的my…...

第58步 深度学习图像识别:Transformer可视化(Pytorch)

一、写在前面 &#xff08;1&#xff09;pytorch_grad_cam库 这一期补上基于基于Transformer框架可视化的教程和代码&#xff0c;使用的是pytorch_grad_cam库&#xff0c;以Bottleneck Transformer模型为例。 &#xff08;2&#xff09;算法分类 pytorch_grad_cam库中包含的…...

angular实现全局组件

之前我们实现全局组件的第一种方式。我们是在定义了组件的时候通过在declares:[component],然后exports出该组件。最后在页面中每次导入该组件&#xff0c;而这次我们将采用另一种方式来实现 1 新建公用组件&#xff1a; navbreadcrumbnavbreadcrumb.component.htmlnavbreadc…...

Spring编程模型(范式)

面向对象编程 契约接口&#xff1a;Aware aware:意识到的 契约接口(Aware)是Spring框架中的一个特性&#xff0c;它允许Bean对象意识到它们所在的环境并与之进行交互&#xff0c;用于提供特定的功能或信息给Bean对象。这些接口通常作为回调接口&#xff0c;在Bean初始化过程…...

Golang GORM 单表删除

删除只有一个操作&#xff0c;delete。也是先找到再去删除。 可以删除单条记录&#xff0c;也可以删除多条记录。 var s Studentdb.Debug().Delete(&s, "age ?", 100)fmt.Println(s)[15.878ms] [rows:1] DELETE FROM student WHERE age 100var s Studentdb.De…...

Windows 下 MySQL 源码学习环境搭建步骤【建议收藏】

【建议收藏】Windows 下如何安装最新版 MySQL 源码学习的调试环境步骤。 作者&#xff1a;芬达 《芬达的数据库学习笔记》公众号作者&#xff0c;开源爱好者&#xff0c;擅长 MySQL、ansible。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&#xff0c;原创内容未经授权不…...

redis总复习

springboot基于redisson实现看门狗锁:Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】_springboot redission lock_AP0906424的博客-CSDN博客 springboot基于redis实现设置缓存和过期时间的代码&#xff1f;包括key的设计 https://mbd.baidu.com/ug_share…...

[LeetCode - Python]844. 比较;含退格的字符串(Easy);415. 字符串相加(Easy)

1.题目 844. 比较含退格的字符串&#xff08;Easy&#xff09; 1.代码&#xff1a; class Solution:def backspaceCompare(self, s: str, t: str) -> bool:# 暴力法s list(s)t list(t)M 0N 0for i in range(len(s)):i -M if s[i] # :if i > 0 :s.pop(i)s.pop(i-…...

机器学习深度学习——NLP实战(自然语言推断——注意力机制实现)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——NLP实战&#xff08;自然语言推断——数据集&#xff09; &#x1f4da;订阅专栏&#xff1a;机器学习&…...

mac垃圾清理软件有哪些

随着使用时间的增加&#xff0c;mac系统会产生一些垃圾文件&#xff0c;影响系统的性能和稳定性。为了保持mac系统的高效&#xff0c;用户需要定期使用mac垃圾清理软件来清理系统缓存、日志、语言包等无用文件。CleanMyMac是一款功能强大的mac垃圾清理软件&#xff0c;它可以帮…...

8.18 校招 内推 面经

绿泡泡&#xff1a; neituijunsir 交流裙&#xff0c;内推/实习/校招汇总表格 1、校招 | 小米集团2024届全球校园招聘正式启动&#xff08;内推&#xff09; 校招 | 小米集团2024届全球校园招聘正式启动&#xff08;内推&#xff09; 2、2023校招总结--软件测试岗位 - 2 2…...

docker的web管理平台docker.ui

docker.ui安装 docker run --name docker.ui \ -p 8999:8999 \ --restartalways \ -v /var/run/docker.sock:/var/run/docker.sock \ -d joinsunsoft/docker.ui参数说明&#xff1a; docker run&#xff1a;启动container–name&#xff1a;容器命名–restartalways&#xff…...

可以做网站高仿服装吗/重庆广告公司

不限(学硕)(0101)哲学(学硕)(0201)理论经济学(学硕)(0202)应用经济学(专硕)(0251)金融硕士(专硕)(0252)应用统计硕士(专硕)(0253)税务硕士(专硕)(0254)国际商务硕士(专硕)(0255)保险硕士(专硕)(0256)资产评估硕士(专硕)(0257)审计硕士(学硕)(0270)统计学(学硕)(0301)法学(学硕)…...

ui设计的网站/企业seo如何优化

下载源码和示例1 原理&#xff1a;启动一个线程来刷时间&#xff0c;缺点是不太精确&#xff0c;可能跟线程的优先级有关系。会有0-10ms的误差。精确到0.1s是没有问题的。packagetimer;publicclassTimer ...{ private long interval; // private boolean enabled; pri…...

索引网站有哪些/网络推广是做什么的

本文记录了linux mysql 8.0.18 安装配置图文教程&#xff0c;供大家参考&#xff0c;具体内容如下1、官网安装包下载地址2、我这里通过xftp将安装包上传至Linux服务器3.解压解压命令&#xff1a;tar -xvf mysql-8.0.18-linux-glibc2.12-x86_64.tar继续解压需要的那一个命令&…...

怎么知道网站有没有备案/2345网址导航删除办法

React 路由理解: 什么是路由&#xff1f;1: 一个路由就是一个映射关系(key: value);2: key: 为路径, value: 为function 或者component路由的分类:后端路由: 理解为: value是 functuion, 用来处理客户提交的请求。注册路由: router.get(path, (ctx, next)> {});工作过程: 当…...

男科医院治疗一次2000元/优就业seo课程学多久

最近做以太坊钱包项目需要与前台进行json交互&#xff0c;写一个工具类&#xff0c;经普通javaBean转为json对象 1 package util;2 3 import java.lang.reflect.Field;4 import java.lang.reflect.Method;5 import java.util.List;6 7 import org.web3j.protocol.core.methods.…...

响应式网站建设过时吗/营销策划书格式及范文

上周五新的iPhone在全世界的苹果专卖店上架了&#xff0c;不甘寂寞的华为也没闲着。就在周五当天&#xff0c;华为的“橙汁”卡车开上了伦敦的街头&#xff0c;停在了苹果专卖店的店外&#xff0c;给排队购买新iPhone的果粉们免费发放橙汁。车上标注了“Apple Free” &#xff…...