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

news2025/5/16 20:55:30

文章目录

  • 对比 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.coloradmin.cn/o/2377130.html

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

相关文章

Git - 1( 14000 字详解 )

一: Git 初识 1.1 提出问题 在工作或学习中,我们常常会面临文档管理的问题,尤其是在编写各种文档时。为了防止文档丢失或因更改失误而无法恢复,我们常常会创建多个版本的副本,例如:“报告-v1”、“报告-v…

TCPIP详解 卷1协议 九 广播和本地组播(IGMP 和 MLD)

9.1——广播和本地组播(IGMP 和 MLD) IPv4可以使用4种IP地址:单播(unicast)、任播(anycast)、组播(multicast)和广播(broadcast)。 IPv6可以使用…

16.1 - VDMA视频转发实验之TPG

文章目录 1 实验任务2 系统框图3 硬件设计3.1 IP核配置3.2 注意事项 4 软件设计4.1 注意事项4.2 工程源码4.2.1 main.c文件 1 实验任务 基于14.1,使用Xilinx TPG(Test Pattern Generator) IP提供视频源,将视频数据通过VDMA写入PS…

cocos creator 3.8 下的 2D 改动

在B站找到的系统性cocos视频教程,纯2D开发入门,链接如下: zzehz黑马程序员6天实战游戏开发微信小程序(Cocos2d的升级版 CocosCreator JavaScript)_哔哩哔哩_bilibili黑马程序员6天实战游戏开发微信小程序(Cocos2d的升级版 CocosCreator Ja…

Unity光照笔记

问题 在做项目中遇到了播放中切换场景后地面阴影是纯黑的问题,不得不研究一下光照。先放出官方文档。 Lighting 窗口 - Unity 手册 播放中切换场景后地面阴影是纯黑 只有投到地面的阴影是纯黑的。且跳转到使用相同Terrain的场景没有问题。 相关文章&#xff1a…

嵌入式学习的第二十天-数据结构-调试+链表的一般操作

一、调试 1.一般调试 2.找段错误 二、链表的一般操作 1.单链表的修改 int ModifyLinkList(LinkList*ll,char*name,DATATYPE*data) {DATATYPE * tmp FindLinkList(ll, name);if(NULL tmp){return 1;}memcpy(tmp,data,sizeof(DATATYPE));return 0; } 2.单链表的销毁 int D…

家具制造行业的现状 质检LIMS如何赋能家具制造企业质检升级

在家具制造行业,从原木切割到成品出厂,质检环节贯穿始终 —— 木材含水率是否达标、板材甲醛释放量是否合规、涂层耐磨性能否通过标准…… 这些看似琐碎的检测项目,实则是企业把控产品品质、规避市场风险的核心关卡。传统人工质检模式在效率、…

idea整合maven环境配置

idea整合maven 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有:学习and理解的关联性。【帮帮志系列文章】:每个知识点,都是写出代码…

无偿帮写毕业论文(看不懂的可以私信博主)

以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行,脱产学习这么多年,终于熬出头了,完成毕设后有空就去多看看亲人好友,祝好! 一、找一个论文模板 废话不多说,先上干货Ov…

小白成长之路-vim编辑

文章目录 Vim一、命令模式二、插入模式3.a:进入插入模式,在当前光标的后一个字符插入![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/fd293c3832ed49e2974abfbb63eeb5bb.png)4.o: 在当前光标的下一行插入5.i:在当前光标所在字符插入,返回命令模…

【常用算法:排序篇】7.算法魔法与面试秘籍:从趣味排序到实战通关

一、趣味排序算法:突破常规的思维火花 1. 睡眠排序(Sleep Sort)—— 时间维度的魔法 核心思想:利用多线程休眠时间模拟数值大小,自然输出有序结果。Python示例:import threading import timedef sleep_so…

Android | IOS — Solox性能测试

文章目录 Solox性能测试1. 前置条件2. 软件图片 Solox性能测试 1. 前置条件 安装Python:3.10.0以上版本: Windows:Python官网 安装 SoloX python -m solox2. 软件图片 软件图片 报告分析:

Midjourney 最佳创作思路与实战技巧深度解析【附提示词与学习资料包下载】

引言 在人工智能图像生成领域,Midjourney 凭借其强大的艺术表现力和灵活的创作模式,已成为设计师、艺术家和创意工作者的核心工具。作为 CSDN 博主 “小正太浩二”,我将结合多年实战经验,系统分享 Midjourney 的创作方法论&#x…

工具篇-扣子空间MCP,一键做游戏,一键成曲

一、登陆扣子空间 地址如下: 扣子空间 打开,然后登陆扣子 登陆之后快速开始: 二、生成游戏 小试牛刀,我们让它做一个打地鼠的游戏: 已经开始设计制作: 制作完成: 三、制作音乐 新…

5.6 - 5.9 MySQL

数据库:存储和管理数据的仓库DB。 数据库管理系统:操纵和管理数据库的大型软件DBMS。 关系型数据库 一个数据库内可以创建多张表,在一个表内能存放多个数据。 SQL语句: DDL: 存储字符串用varchar。(类似于…

C# WinForm 如何高效地将大量数据从 CSV 文件导入 DataGridView

如果你有非常多的csv文件,每个文件包含N多行与M多列,如:18000 行和 27 列。现在,想制作一个 Windows 窗体应用程序,导入它们并在 datagridview 中显示,然后进行一些数学运算。可是,发现数据导入…

SQLPub:一个提供AI助手的免费MySQL数据库服务

给大家介绍一个免费的 MySQL 在线数据库环境:SQLPub。它提供了最新版本的 MySQL 服务器测试服务,可以方便开发者和测试人员验证数据库功能,也可以用于学习 MySQL。 免费申请 在浏览器中输入以下网址: https://sqlpub.com/ SQLP…

URP相机如何将场景渲染定帧模糊绘制

1)URP相机如何将场景渲染定帧模糊绘制 2)为什么Virtual Machine会随着游戏时间变大 3)出海项目,打包时需要勾选ARMv7吗 4)Unity是手动还是自动调用GC.Collect 这是第431篇UWA技术知识分享的推送,精选了UWA社…

WeakAuras Lua Script ICC (BarneyICC)

WeakAuras Lua Script ICC (BarneyICC) https://wago.io/BarneyICC/69 全量英文字符串: !WA:2!S33c4TXX5bQv0kobjnnMowYw2YAnDKmPnjnb4ljzl7sqcscl(YaG6HvCbxaSG7AcU76Dxis6uLlHNBIAtBtRCVM00Rnj8Y1M426ZH9XDxstsRDR)UMVCTt0DTzVhTjNASIDAU…

FramePack - 开源 AI 视频生成工具

🎬 项目简介 由开发者 lllyasviel 创建的一个轻量级动画帧处理工具库,专门用于游戏开发、动画制作和视频处理中的帧序列打包与管理。该项目采用高效的算法实现,能够显著提升动画资源的处理效率。 此 AI 视频生成项目,旨在通过低显…