grpc 和 http 的区别---二进制vsJSON编码

news2025/4/22 22:05:06

gRPC 和 HTTP 是两种广泛使用的通信协议,各自适用于不同的场景。以下是它们的详细对比与优势分析:

一、核心特性对比

特性gRPCHTTP
协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2
数据格式默认使用 Protobuf(二进制)通常使用 JSON/XML(文本)
传输效率高(二进制编码 + 多路复用)较低(文本编码 + 无多路复用)
流式支持支持(客户端流、服务器流、双向流)有限(HTTP/2 支持 Server Push,但不如 gRPC 灵活)
代码生成支持(通过 Protobuf 生成客户端/服务端代码)无(需手动编写客户端/服务端代码)
跨语言支持优秀(官方支持多种语言)优秀(几乎所有语言都支持 HTTP)
适用场景高性能、低延迟的微服务通信通用 Web 服务、RESTful API

二、gRPC 的优势

  1. 高性能

    二进制编码:Protobuf 比 JSON/XML 更紧凑,序列化/反序列化速度更快。

    多路复用:基于 HTTP/2,单个连接可并行处理多个请求,减少连接开销。

    头部压缩:HTTP/2 的 HPACK 算法显著减少头部大小。

  2. 强类型接口

    Protobuf 定义:通过 .proto 文件定义服务接口和消息格式,避免手动解析和验证。

    代码生成:自动生成客户端和服务端代码,减少开发工作量。

  3. 流式通信

    四种模式:

     一元 RPC(Unary)
    
     客户端流(Client Streaming)
    
     服务器流(Server Streaming)
    
     双向流(Bidirectional Streaming)
    

    适用场景:实时数据传输(如聊天、日志流)。

  4. 跨语言支持

    官方支持:C++, Java, Python, Go, Ruby, C#, Node.js 等。

    一致性:不同语言生成的代码行为一致,减少跨团队协作成本。

  5. 内置功能

    拦截器:支持中间件模式(如认证、日志、限流)。

    超时与重试:内置机制,简化容错设计。

三、HTTP 的优势

  1. 通用性

    广泛支持:几乎所有编程语言和框架都支持 HTTP。

    工具生态:丰富的调试工具(如 Postman、curl)和监控方案(如 Prometheus)。

  2. 可读性

    文本格式:JSON/XML 易于人类阅读和调试。

    自描述性:无需额外定义接口文档(如 Swagger)。

  3. 兼容性

    RESTful 风格:符合 Web 标准,易于与现有系统集成。

    浏览器支持:直接用于前端与后端通信。

  4. 灵活性

    无状态:适合分布式系统设计。

    缓存支持:利用 HTTP 缓存机制(如 ETag、Cache-Control)提升性能。

  5. 部署简单

    无需额外依赖:直接运行在 Web 服务器(如 Nginx、Apache)上。

    防火墙友好:使用标准端口(80/443),无需特殊配置。

四、适用场景对比

场景推荐协议原因
微服务通信gRPC高性能、强类型、流式支持
实时数据传输gRPC双向流、低延迟
浏览器与后端通信HTTP浏览器原生支持
公开 APIHTTP通用性强、易于调试
跨平台数据交换HTTP文本格式易于解析
高性能内部系统gRPC二进制编码、多路复用

五、性能对比

  1. 延迟

    gRPC:由于二进制编码和多路复用,延迟显著低于 HTTP(尤其是高并发场景)。

    HTTP:文本编码和连接开销导致延迟较高。

  2. 吞吐量

    gRPC:单连接可处理更多请求,适合高吞吐场景。

    HTTP:受限于连接数和文本编码,吞吐量较低。

  3. 资源占用

    gRPC:CPU 和内存占用较低(得益于高效编码)。

    HTTP:资源占用较高(尤其是 JSON 解析)。

六、如何选择?

选择 gRPC 的场景

需要高性能、低延迟的通信(如微服务、实时系统)。

需要强类型接口和代码生成(如跨团队协作)。

需要流式通信(如实时日志、消息推送)。

选择 HTTP 的场景

需要与浏览器或移动端通信。

需要公开 API 或与第三方系统集成。

需要快速原型开发或调试。

七、混合使用建议

在实际项目中,可以结合两者的优势:

内部服务:使用 gRPC 实现高性能通信。

对外 API:使用 HTTP 提供 RESTful 接口。

网关层:通过 API 网关(如 Envoy、Kong)将 HTTP 请求转换为 gRPC。

通过合理选择协议,可以最大化系统性能和开发效率。

八、wireshark截图,对比 protobuf 和 json编码

grpc: protobuf 编码

在这里插入图片描述
请求:
在这里插入图片描述
响应:
在这里插入图片描述

Http:JSON 编码

在这里插入图片描述
请求:
在这里插入图片描述
响应:
在这里插入图片描述总结:可以看到protobuf 和 json 编码对于同样的业务数据,protobuf编码的数据更紧凑。

对于json:这是一个用 JSON 表示的用户信息:
{
  "id": 123,
  "name": "Alice",
  "email": "alice@example.com"
}
可读性:人类可以直接阅读和理解。
冗余性:字段名(如 "id"、"name")重复出现,占用额外空间。
解析开销:需要将文本转换为内存中的数据结构(如字典、对象),性能较低。
兼容性:几乎所有编程语言都支持 JSON/XML 解析。


对于 protobuf:这是用 Protobuf 定义的相同用户信息:
message User {
  int32 id = 1;
  string name = 2;
  string email = 3;
}
编码后的二进制数据可能是这样的(十六进制表示):
08 7B 12 05 41 6C 69 63 65 1A 10 61 6C 69 63 65 40 65 78 61 6D 70 6C 65 2E 63 6F 6D
紧凑性:去除了冗余信息(如字段名),仅存储数据和元数据(如字段编号)。
高效性:序列化/反序列化速度快,占用带宽和存储空间少。
不可读性:人类无法直接理解二进制数据。
强类型:通过 .proto 文件定义数据结构,确保类型安全。

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

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

相关文章

Cypher入门

文章目录 Cypher入门创建数据查询数据matchoptional matchwhere分页with 更新数据删除数据实例:好友推荐 Cypher入门 Cypher是Neo4j的查询语言。 创建数据 在Neo4j中使用create命令创建节点、关系、属性数据。 create (n {name:$value}) return n //创建节点&am…

深度学习深度解析:从基础到前沿

引言 深度学习作为人工智能的一个重要分支,通过模拟人脑的神经网络结构来进行数据分析和模式识别。它在图像识别、自然语言处理、语音识别等领域取得了显著成果。本文将深入探讨深度学习的基础知识、主要模型架构以及当前的研究热点和发展趋势。 基础概念与数学原理…

如何使用SliverGrid组件

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了SliverList组件相关的内容,本章回中将介绍SliverGrid组件.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的SliverGrid组件是一种网格类组件,主要用来…

K8S集群架构及主机准备

本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…

012-51单片机CLD1602显示万年历+闹钟+农历+整点报时

1. 硬件设计 硬件是我自己设计的一个通用的51单片机开发平台,可以根据需要自行焊接模块,这是用立创EDA画的一个双层PCB板,所以模块都是插针式,不是表贴的。电路原理图在文末的链接里,PCB图暂时不选择开源。 B站上传的…

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done.

深度学习查漏补缺:1.梯度消失、梯度爆炸和残差块

一、梯度消失 梯度消失的根本原因在于 激活函数的性质和链式法则的计算: 激活函数的导数很小: 常见的激活函数(例如 Sigmoid 和 Tanh)在输入较大或较小时,输出趋于饱和(Sigmoid 的输出趋于 0 或 1&#xf…

于动态规划的启幕之章,借 C++ 笔触绘就算法新篇

注意:代码由易到难 P1216 [IOI 1994] 数字三角形 Number Triangles 题目链接:[IOI 1994] 数字三角形 Number Triangles - 洛谷 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每…

基于开源2 + 1链动模式AI智能名片S2B2C商城小程序的内容创作与传播效能探究

摘要:本文围绕开源2 1链动模式AI智能名片S2B2C商城小程序,深入探讨在其应用场景下内容创作与传播效果的关键要素——转发数与转化率。通过剖析如何创作引发用户共鸣、提升用户信任的内容,阐明深度思考内容本质对于实现有效传播的重要性&…

深度学习之“线性代数”

线性代数在深度学习中是解决多维数学对象计算问题的核心工具。这些数学对象包括标量、向量、矩阵和张量,借助它们可以高效地对数据进行操作和建模。以下将详细介绍这些数学对象及其在深度学习中的典型用途。 数学对象概述 标量 标量是最简单的数学对象&#xff0…

SpringBoot的配置(配置文件、加载顺序、配置原理)

文章目录 SpringBoot的配置(配置文件、加载顺序、配置原理)一、引言二、配置文件1、配置文件的类型1.1、配置文件的使用 2、多环境配置 三、加载顺序四、配置原理五、使用示例1、配置文件2、配置类3、控制器 六、总结 SpringBoot的配置(配置文件、加载顺序、配置原理) 一、引言…

CVE-2023-38831 漏洞复现:win10 压缩包挂马攻击剖析

目录 前言 漏洞介绍 漏洞原理 产生条件 影响范围 防御措施 复现步骤 环境准备 具体操作 前言 在网络安全这片没有硝烟的战场上,新型漏洞如同隐匿的暗箭,时刻威胁着我们的数字生活。其中,CVE - 2023 - 38831 这个关联 Win10 压缩包挂…

Clion开发STM32时使用stlink下载程序与Debug调试

一、下载程序 先创建一个文件夹: 命名:stlink.cfg 写入以下代码: # choose st-link/j-link/dap-link etc. #adapter driver cmsis-dap #transport select swdsource [find interface/stlink.cfg]transport select hla_swdsource [find target/stm32f4x.…

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统,openipc 是采用buildroot系统编译而成,因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢?因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来,从而…

C语言 --- 分支

C语言 --- 分支 语句分支语句含义if...else语句单分支if语句语法形式 双分支 if-else 语句语法形式 悬空else含义问题描述 多分支 if-else 语句语法形式 switch...case语句含义语法形式 总结 💻作者简介:曾与你一样迷茫,现以经验助你入门 C 语…

低代码系统-产品架构案例介绍、炎黄盈动-易鲸云(十二)

易鲸云作为炎黄盈动新推出的产品,在定位上为低零代码产品。 开发层 表单引擎 表单设计器,包括设计和渲染 流程引擎 流程设计,包括设计和渲染,需要说明的是:采用国际标准BPMN2.0,可以全球通用 视图引擎 视图…

自制虚拟机(C/C++)(三、做成标准GUI Windows软件,扩展指令集,直接支持img软盘)

开源地址:VMwork 要使终端不弹出&#xff0c; #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup") 还要实现jmp near 0x01类似的 本次的main.cpp #include <graphics.h> #include <conio.h> #include <windows.h> #includ…

[c语言日寄]C语言类型转换规则详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…

利用Spring Batch简化企业级批处理应用开发

1. 引言 1.1 批处理的重要性 在现代企业系统中,批处理任务用于处理大量数据,如报表生成、数据迁移、日终结算等。这些任务通常不需要实时响应,但需要高效、可靠地完成。批处理可以显著提高系统性能,减少实时系统的负载,并确保数据的完整性和一致性。 1.2 Spring Batch简…

三、js笔记

(一)JavaScript概述 1、发展历史 ScriptEase.(客户端执行的语言):1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)Javascript:Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigat…