对比 HTTP-REST 与 gRPC:各自的优缺点以及适用的场景

文章目录

  • 对比 HTTP-REST 与 gRPC:各自的优缺点以及适用的场景
    • HTTP-REST 与 gRPC 的核心区别
    • gRPC 的优缺点
    • HTTP-REST 的优缺点
    • 适用场景
  • 模糊点
    • 什么是 Protobuf?
    • HTTP/2 会将 HTTP 消息拆分并封装为二进制帧,那还能过使用 HTTP/2 构建 RESTful 接口吗?
    • 如果 HTTP/2 支持 RESTful 接口,那为什么还需要 gRPC 呢?

对比 HTTP-REST 与 gRPC:各自的优缺点以及适用的场景

在这里插入图片描述
最近在总结近期学习的一个使用 gRPC + Gin 写的 Golang 微服务项目,微服务的框架选用的是 gRPC,它是 RPC 的一种,可以让客户端像是在调用本地函数一样对远程服务器当中的函数进行调用。

通过对该项目进行学习,我个人感觉 gRPC 与 HTTP-REST 所做的工作非常的相似,即根据发起的请求,返回相应的结果,因此对二者的区别进行了详细的调研,通过本篇文章进行简要的总结。

HTTP-REST 与 gRPC 的核心区别

特性gRPCHTTP
协议基于 HTTP/2 通信通常基于 HTTP/1.1,但也可以使用 HTTP/2
数据格式默认使用 Protobuf 进行字节流的序列化与反序列化通常使用 JSON/XML
通信模式支持单向、双向流式通信仅支持请求-响应,无流式
性能高(二进制编码 + HTTP/2 多路复用)较低(文本解析 + HTTP/1.1 的无多路复用)
适用场景微服务之间的通信、实时流式数据Web API(返回 RESTful API 的数据给前端)、浏览器兼容场景

gRPC 的优缺点

✅优点

  • 高性能:Protobuf 序列化和反序列化的编码体积小,使用 HTTP/2 传输降低延迟;
  • 流式支持:适合实时数据传输(聊天、日志流);
  • 强类型接口:通过 .proto 文件明确定义服务和方法;
  • 跨语言支持:自动生成多客户端语言。

❌缺点

  • 浏览器支持差:需要 gRPC-Web 代理;
  • 调试复杂:二进制数据需要经过转换才能为人所阅读;
  • 生态工具较少:与 HTTP-REST 相比,gRPC 的工具链尚不成熟。

HTTP-REST 的优缺点

✅优点

  • 通用性强:所有语言和平台(甚至是 IoT)原生支持;
  • 可读性好:使用 JSON/XML 格式进行数据传输,便于接口调试和日志记录;
  • 浏览器友好:直接用于前端调用。

❌缺点

  • 性能较低:基于纯文本进行传输的效率较低,对纯文本进行解析的成本也较高;
  • 无流式支持:HTTP-REST 仅支持通过请求-响应模式请求资源,不支持流式传输;
  • 弱类型约束:接口规范依赖于文档。

适用场景

gRPC(HTTP/2 + Protobuf)
更适用于微服务之间的通信以及流式数据传输。

HTTP-REST(HTTP/1.1 或 HTTP/2 + JSON)

  • 浏览器直接调用 API:如果使用 gRPC 则还需要 gRPC-web 进行代理,但是如果此时使用 HTTP-REST 可以直接获得 JSON 格式的数据;
  • 快速原型开发:JSON 很容易手动构造,而 protobuf 则需要编译 .proto 文件;
  • 兼容旧系统:遗留系统可能不支持 gRPC,但基本都支持 HTTP + JSON。

模糊点

根据以上内容的总结,我产生了一些模糊点,在此列举并深入研究一下。

什么是 Protobuf?

Protobuf(Protocol Buffers)可以被理解为一种高效的数据序列化与反序列化协议,它的核心作用是将结构化的数据(如对象或消息)转换为二进制格式(序列化),或将字节流当中的二进制数据转换为原始数据(反序列化)。

如果想要使用 gRPC 来建立微服务,那么所编写的 proto 文件很有可能包含 service 和 message 两部分,service 当中定义了具体的远程过程调用函数,而 message 定义了 RPC 函数的请求结构体和响应结构体。

✅ Protobuf 的优点

  • 高性能:二进制编码体积小,网络传输与序列化和反序列化的时间开销随之降低;
  • 强类型与模式化:通过 proto 文件定义数据结构,避免运行时错误;
  • 跨语言支持:protobuf 官方支持多种语言,生成的代码接口一致。

❌ Protobuf 的缺点

  • 需要预编译:必须先定义 proto 文件并编译生成相应语言的代码,灵活性低于 JSON;
  • 可读性差:二进制数据不能直接阅读,如需调试需要借助工具;
  • 不适合所有场景:比如浏览器直接处理 Protobuf 格式的数据非常复杂,对于 gRPC 而言还需要借助 gRPC-web 代理才能过读取,浏览器场景更适合直接使用 JSON 进行序列化与反序列化。

💡 Protobuf 的常见使用场景

  • 微服务通信:gRPC 默认使用 Protobuf 通信,替代 REST + JSON;
  • 高性能存储:如数据库缓存、日志存储;
  • 跨语言数据交换:不同语言服务间传递结构化数据(当然这一点基于 JSON 也能做到)。

HTTP/2 会将 HTTP 消息拆分并封装为二进制帧,那还能过使用 HTTP/2 构建 RESTful 接口吗?

完全可以。因为 HTTP/2 只是 HTTP 协议的一个版本,它将 HTTP 消息(Header + Body)拆分为二进制帧只是为了优化传输效率(多路复用、头部压缩),但不改变 HTTP 的语义。

具体来说,应用层的原始数据(比如 JSON 或 XML,也可以是 Protobuf)不会被拆分为二进制帧,HTTP/2 将数据转为二进制的时机是在将应用层数据通过传输层发送之前。在传输层发送字节流之前,HTTP/2 会将 HTTP 消息(Header + Body)拆分并封装为二进制帧,从而管理多路复用和优先级,提升了传输以及序列化反序列化的效率。

如果 HTTP/2 支持 RESTful 接口,那为什么还需要 gRPC 呢?

虽然 HTTP/2 本身已经优化了传输效率,但是 gRPC 基于 HTTP/2 进行了进一步的优化,具体体现在使用 Protobuf 作为数据的编码形式,为 HTTP/2 引入了强类型约束,并且具有高性能和跨语言的特性。

此外,HTTP/2 + REST-JSON 仅支持请求-响应模式,无法实现持续的数据流。

而 gRPC 原生支持 4 种通信模式:

  • Unary RPC(类似 REST,单一请求-响应);
  • Server Streaming RPC(服务端推送流,比如实时日志);
  • Client Streaming RPC(客户端上传流,如文件分块上传);
  • Bidirectional Streaming RPC(双向流,如聊天应用)。

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

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

相关文章

现代健康生活养生指南

现代社会中,熬夜加班、久坐不动、饮食不规律成为许多人的生活常态,由此引发的健康问题也日益增多。想要摆脱亚健康,不必依赖中医理念,从以下这些现代科学养生方法入手,就能逐步改善身体状况。​ 饮食上,注…

Go语言数组的定义与操作 - 《Go语言实战指南》

在 Go 语言中,数组(Array) 是一种定长、同类型的集合。它在内存中是连续分布的,适合用于性能敏感的场景。 一、数组的定义 数组的基本语法如下: var 数组名 [长度]元素类型 示例: var nums [5]int …

Helm Chart 中配置多个 Docker Registry 地址以实现备用访问

在 Helm Chart 中配置多个 Docker Registry 地址以实现备用访问,可以通过以下几种方式实现: 1. 在 values.yaml 中定义多个 Registry 在 values.yaml 中定义主 Registry 和备用 Registry,以便在部署时灵活切换: # values.yaml …

云原生安全:错误策略S3存储桶ACL设置为Everyone:FullControl

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 ——从基础到实践的深度解析 1. 基础概念 S3存储桶与ACL Amazon S3(Simple Storage Service)是AWS提供的对象存储服务,支持存储和检索任意规模的数据。ACL(访问控制列表…

.NET 8 kestrel 配置PEM,实现内网https

一、生成证书 mkcert 是一个简单的工具,用于制作本地信任的开发证书。它不需要配置。 mkcert官方仓库地址:GitHub - FiloSottile/mkcert: A simple zero-config tool to make locally trusted development certificates with any names youd like. 简…

nodejs快速入门到精通1

参考 nodejs快速入门到精通 菜鸟教程-nodejs nodejs官方文档 原因 视频免费 资料收费 笔记还是自己写吧 安装 nodejs官网 windows下: #查看nodejs版本 node -v #查看npm版本 npm -v #设置npm为淘宝镜像源 npm config set registry https://registry.npmmirror.…

nginx负载均衡及keepalive高可用

实验前期准备: 5台虚拟机:4台当做服务器,1台当做客户机(当然,也可以使用主机的浏览器),4台服务器中,2台服务器当做后端真实访问服务器;另外2台服务器当做负载均衡服务器…

go语法大赏

前些日子单机房稳定性下降,找了好一会才找到真正的原因。这里面涉及到不少go语法细节,正好大家一起看一下。 一、仿真代码 这是仿真之后的代码 package mainimport ("fmt""go.uber.org/atomic""time" )type StopSignal…

Android 14 解决打开app出现不兼容弹窗的问题

应用安装到 Android 14 上,出现如下提示 This app isn’t compatible with the latest version of Android. Check for an update or contact the app’s developer. 通过源码找原因。 提示的字符 根据字符找到 ./frameworks/base/core/res/res/values/strings.xm…

Linux句柄数过多问题排查

以下是Linux句柄数过多问题的排查与解决方法整理&#xff1a; 一、检测句柄使用情况 1‌.查看系统限制‌ 单个进程限制&#xff1a;ulimit -n 系统级总限制&#xff1a;cat /proc/sys/fs/file-max 2‌.统计进程占用量‌ 查看指定进程&#xff1a;lsof -p <PID> | wc -…

matlab插值方法(简短)

在MATLAB中&#xff0c;可以使用interp1函数快速实现插值。以下代码展示了如何使用spline插值方法对给定数据进行插值&#xff1a; x1 [23,56]; y1 [23,56]; X 23:1:56*4; Y interp1(x1,y1,X,spline);% linear、 spline其中&#xff0c;x1和y1是已知数据点&#xff0c;X是…

时间筛掉了不够坚定的东西

2025年5月17日&#xff0c;16~25℃&#xff0c;还好 待办&#xff1a; 《高等数学1》重修考试 《高等数学2》备课 《物理[2]》备课 《高等数学2》取消考试资格学生名单 《物理[2]》取消考试资格名单 职称申报材料 2024年税务申报 5月24日、25日监考报名 遇见&#xff1a;敲了一…

hexo博客搭建使用

搭建 Hexo 演示主题为&#xff1a;Keep 使用 文章 创建新文章 ➜ zymore-blog-keep git:(main) ✗ hexo new "告别H5嵌入&#xff01;uniApp小程序文件下载与分享完整解决方案" INFO Validating config INFO Created: ~/Desktop/HelloWorld/zymore-blog-k…

React组件开发流程-03.1

此章先以一个完整的例子来全面了解下React组件开发的流程&#xff0c;主要是以代码为主&#xff0c;在不同的章节中会把重点标出来&#xff0c;要完成的例子如下&#xff0c;也可从官网中找到。 React组件开发流程 这只是一个通用流程&#xff0c;在熟悉后不需要完全遵从。 …

Cloudflare防火墙拦截谷歌爬虫|导致收录失败怎么解决?

许多站长发现网站突然从谷歌搜索结果中“消失”&#xff0c;背后很可能是Cloudflare防火墙误拦截了谷歌爬虫&#xff08;Googlebot&#xff09;&#xff0c;导致搜索引擎无法正常抓取页面。 由于Cloudflare默认的防护规则较为严格&#xff0c;尤其是针对高频访问的爬虫IP&…

Ubuntu系统安装VsCode

在Linux系统中&#xff0c;可以通过.deb文件手动安装Visual Studio Code&#xff08;VS Code&#xff09;。以下是详细的安装步骤&#xff1a; 下载.deb文件 访问Visual Studio Code的官方网站。 在下载页面中&#xff0c;找到适用于Linux的.deb文件。 根据你的系统架构&…

降本增效双突破:Profinet转Modbus TCP助力包布机产能与稳定性双提升

在现代工业自动化领域&#xff0c;ModbusTCP和Profinet是两种常见的通讯协议。它们在数据传输、设备控制等方面有着重要作用。然而&#xff0c;由于这两种协议的工作原理和应用环境存在差异&#xff0c;直接互联往往会出现兼容性问题。此时&#xff0c;就需要一种能够实现Profi…

Python对JSON数据操作

在Python中&#xff0c;对JSON数据进行增删改查及加载保存操作&#xff0c;主要通过内置的json模块实现。 一、基础操作 1. 加载JSON数据 • 从文件加载 使用json.load()读取JSON文件并转换为Python对象&#xff08;字典/列表&#xff09;&#xff1a; import json with open…

Linux详解基本指令(一)

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;LInux_st 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&a…

Node-Red通过Profinet转ModbusTCP采集西门子PLC数据配置案例

一、内容简介 本篇内容主要介绍Node-Red通过node-red-contrib-modbus插件与ModbusTCP设备进行通讯&#xff0c;这里Profinet转ModbusTCP网关作为从站设备&#xff0c;Node-Red作为主站分别从0地址开始读取10个线圈状态和10个保持寄存器&#xff0c;分别用Modbus-Read、Modbus-…