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

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

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 文件定义数据结构,确保类型安全。

相关文章:

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

gRPC 和 HTTP 是两种广泛使用的通信协议,各自适用于不同的场景。以下是它们的详细对比与优势分析: 一、核心特性对比 特性gRPCHTTP协议基础基于 HTTP/2基于 HTTP/1.1 或 HTTP/2数据格式默认使用 Protobuf(二进制)通常使用 JSON/…...

C#面向对象(封装)

1.什么是封装? C# 封装 封装 被定义为“把一个或多个项目封闭在一个物理的或者逻辑的包中”。 在面向对象程序设计方法论中,封装是为了防止对实现细节的访问。 抽象和封装是面向对象程序设计的相关特性。 抽象允许相关信息可视化,封装则使开发者实现所…...

kamailio-kamctl monitor解释

这段输出是 Kamailio 服务器的运行时信息和统计数据的摘要。以下是对每个部分的详细解释: 1. Kamailio Runtime Details cycle #: 3: 表示 Kamailio 的主循环已经运行了 3 个周期。Kamailio 是一个事件驱动的服务器,主循环用于处理事件和请求。if const…...

39. I2C实验

一、IIC协议详解 1、ALPHA开发板上有个AP3216C,这是一个IIC接口的器件,这是一个环境光传感器。AP3216C连接到了I2C1上: I2C1_SCL: 使用的是UART4_TXD这个IO,复用位ALT2 I2C1_SDA: 使用的是UART4_RXD这个IO。复用为ALT2 2、I2C分为SCL和SDA&…...

GPIO配置通用输出,推挽输出,开漏输出的作用,以及输出上下拉起到的作用

通用输出说明: ①输出原理: 对输出数据寄存器的对应位写0 或 1,就可以控制对应编号的IO口输出低/高电平 ②输出类型 推挽输出:IO口可以输出高电平,也可以输出低电平 开漏输出:IO口只能输出低电平 所以…...

Spring AOP 入门教程:基础概念与实现

目录 第一章:AOP概念的引入 第二章:AOP相关的概念 1. AOP概述 2. AOP的优势 3. AOP的底层原理 第三章:Spring的AOP技术 - 配置文件方式 1. AOP相关的术语 2. AOP配置文件方式入门 3. 切入点的表达式 4. AOP的通知类型 第四章&#x…...

DeepSeek 核心技术全景解析

DeepSeek 核心技术全景解析:突破性创新背后的设计哲学 DeepSeek的创新不仅仅是对AI基础架构的改进,更是一场范式革命。本文将深入剖析其核心技术,探讨 如何突破 Transformer 计算瓶颈、如何在 MoE(Mixture of Experts&#xff09…...

90,【6】攻防世界 WEB Web_php_unserialize

进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file&#xff0c;默认值为 index.phpprivate $file index.php;// 构造函数&#xff0c;当创建类的实例时会自动调用// 接收一个参数 $file&#xff0c;用于初始化对象的 $file 属…...

实现网站内容快速被搜索引擎收录的方法

本文转自&#xff1a;百万收录网 原文链接&#xff1a;https://www.baiwanshoulu.com/6.html 实现网站内容快速被搜索引擎收录&#xff0c;是网站运营和推广的重要目标之一。以下是一些有效的方法&#xff0c;可以帮助网站内容更快地被搜索引擎发现和收录&#xff1a; 一、确…...

WSL2中安装的ubuntu搭建tftp服务器uboot通过tftp下载

Windows中安装wsl2&#xff0c;wsl2里安装ubuntu。 1. Wsl启动后 1&#xff09;Windows下ip ipconfig 以太网适配器 vEthernet (WSL (Hyper-V firewall)): 连接特定的 DNS 后缀 . . . . . . . : IPv4 地址 . . . . . . . . . . . . : 172.19.32.1 子网掩码 . . . . . . . .…...

机器学习优化算法:从梯度下降到Adam及其变种

机器学习优化算法&#xff1a;从梯度下降到Adam及其变种 引言 最近deepseek的爆火已然说明&#xff0c;在机器学习领域&#xff0c;优化算法是模型训练的核心驱动力。无论是简单的线性回归还是复杂的深度神经网络&#xff0c;优化算法的选择直接影响模型的收敛速度、泛化性能…...

[SAP ABAP] 静态断点的使用

在 ABAP 编程环境中&#xff0c;静态断点通过关键字BREAK-POINT实现&#xff0c;当程序执行到这一语句时&#xff0c;会触发调试器中断程序的运行&#xff0c;允许开发人员检查当前状态并逐步跟踪后续代码逻辑 通常情况下&#xff0c;在代码的关键位置插入静态断点可以帮助开发…...

129.求根节点到叶节点数字之和(遍历思想)

Problem: 129.求根节点到叶节点数字之和 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 直接利用二叉树的先序遍历&#xff0c;将遍历过程中的节点值先利用字符串拼接起来遇到根节点时再转为数字并累加起来&#xff0c;在归的过程中&#xf…...

NCCL、HCCL、通信、优化

文章目录 从硬件PCIE、NVLINK、RDMA原理到通信NCCL、MPI原理&#xff01;通信实现方式&#xff1a;机器内通信、机器间通信通信实现方式&#xff1a;通讯协调通信实现方式&#xff1a;机器内通信&#xff1a;PCIe通信实现方式&#xff1a;机器内通信&#xff1a;NVLink通信实现…...

unity学习21:Application类与文件存储的位置

目录 1 unity是一个跨平台的引擎 1.1 使用 Application类&#xff0c;去读写文件 1.2 路径特点 1.2.1 相对位置/相对路径&#xff1a; 1.2.2 固定位置/绝对路径&#xff1a; 1.3 测试方法&#xff0c;仍然挂一个C#脚本在gb上 2 游戏数据文件夹路径&#xff08;只读&…...

17 一个高并发的系统架构如何设计

高并发系统的理解 第一:我们设计高并发系统的前提是该系统要高可用&#xff0c;起码整体上的高可用。 第二:高并发系统需要面对很大的流量冲击&#xff0c;包括瞬时的流量和黑客攻击等 第三:高并发系统常见的需要考虑的问题&#xff0c;如内存不足的问题&#xff0c;服务抖动的…...

Spring Boot 实例解析:配置文件

SpringBoot 的热部署&#xff1a; Spring 为开发者提供了一个名为 spring-boot-devtools 的模块来使用 SpringBoot 应用支持热部署&#xff0c;提高开发者的效率&#xff0c;无需手动重启 SpringBoot 应用引入依赖&#xff1a; <dependency> <groupId>org.springfr…...

pytorch图神经网络处理图结构数据

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 图神经网络&#xff08;Graph Neural Networks&#xff0c;GNNs&#xff09;是一类能够处理图结构数据的深度学习模型。图结构数据由节点&#xff08;vertices&#xff09;和边&#xff08;edges&#xff09;组成&a…...

计算机网络一点事(23)

传输层 端口作用&#xff1a;标识主机特定进程&#xff0c;TCP&#xff0c;UDP协议 端口号分类&#xff1a;服务器&#xff1a;0-1023&#xff0c;熟知 1024-49151 登记 客户端&#xff1a;49152-65535 功能&#xff1a;实现端到端&#xff0c;进程到进程的通信&#xff0c…...

(9)下:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同。小例子的实验

&#xff08;4&#xff09;本实验代码的蓝本&#xff0c;是伊圣雨老师里的课本里的代码&#xff0c;略加改动而来的。 以下是 服务器端的代码&#xff1a; 每当收到客户端的报文时&#xff0c;就测试一下对应的 epoll 事件里的事件标志&#xff0c;不读取报文内容&#xff0c;…...

3个秘诀让城通网盘下载提速10倍:ctfileGet工具全解析

3个秘诀让城通网盘下载提速10倍&#xff1a;ctfileGet工具全解析 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet ctfileGet是一款专注于获取城通网盘直连地址的开源工具&#xff0c;通过本地解析技术帮…...

腾讯VersaViT:多模态视觉理解新标杆

腾讯VersaViT&#xff1a;多模态视觉理解新标杆 【免费下载链接】VersaViT 项目地址: https://ai.gitcode.com/tencent_hunyuan/VersaViT 导语&#xff1a;腾讯最新发布的多模态视觉编码器VersaViT&#xff0c;通过创新的多任务协同训练策略&#xff0c;同时强化语言介…...

Vue3 + FFmpeg.wasm 实战:5分钟搞定浏览器端视频格式转换(附完整代码)

Vue3 FFmpeg.wasm&#xff1a;浏览器端视频处理的革命性方案 当现代Web应用越来越依赖多媒体处理能力时&#xff0c;传统依赖后端转码的方案暴露出明显短板&#xff1a;上传耗时、服务器压力大、隐私数据外流风险。而FFmpeg.wasm的出现彻底改变了这一局面——这个基于WebAssem…...

LingBot-Depth效果实测:与传感器原生深度对比的绝对误差(mm)分布图

LingBot-Depth效果实测&#xff1a;与传感器原生深度对比的绝对误差&#xff08;mm&#xff09;分布图 1. 引言&#xff1a;当深度图遇上“脑补”大师 想象一下&#xff0c;你手里有一张用深度相机拍出来的照片&#xff0c;它告诉你每个像素离相机有多远。但问题是&#xff0…...

Apache Flink Agents 0.2.1版本发布,亮点几何?

Apache Flink社区宣布发布 Apache Flink Agents 0.2 系列的首个缺陷修复版本 0.2.1&#xff0c;包含3项缺陷和漏洞修复及小幅改进&#xff0c;还基于此构建了演示项目。版本发布情况Apache Flink社区很高兴地推出了 Apache Flink Agents 0.2.1 版本。此版本是 0.2 系列的首个缺…...

SQL Server服务启动失败?手把手教你用Local System账户解决SQLEXPRESS报错126

SQL Server服务启动失败&#xff1f;手把手教你用Local System账户解决SQLEXPRESS报错126 当你正准备开始一天的工作&#xff0c;突然发现SQL Server服务无法启动&#xff0c;屏幕上赫然显示着错误代码126&#xff0c;这种突如其来的技术故障往往让人措手不及。作为数据库管理员…...

抖音视频批量下载高效解决方案实战指南

抖音视频批量下载高效解决方案实战指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音批量下载工具&…...

Allegro 17.4约束管理器实战:从基础规则到高速PCB设计优化

1. Allegro约束管理器入门指南 刚接触Allegro 17.4的工程师经常会问&#xff1a;为什么我的PCB设计总是出现DRC报错&#xff1f;为什么高速信号总是不稳定&#xff1f;其实问题的关键往往在于约束管理器的使用。作为Cadence Allegro的核心功能模块&#xff0c;约束管理器就像PC…...

GLM-4.1V-9B-Base模型微调入门:使用accelerate库进行高效参数优化

GLM-4.1V-9B-Base模型微调入门&#xff1a;使用accelerate库进行高效参数优化 1. 引言 想为特定业务场景定制一个强大的多模态AI模型&#xff1f;GLM-4.1V-9B-Base作为支持图文理解与生成的大模型&#xff0c;通过微调可以快速适配各种下游任务。本文将带你从零开始&#xff…...

【Skills开发实战指南】第01篇:Skills开发入门:AI助手的能力扩展革命

快速导航 读完本文&#xff0c;你将获得&#xff1a; ✅ 深入理解Skills是什么以及为什么需要它✅ 掌握Skills在AI编程工具中的核心价值✅ 了解Skills的完整生态和应用场景✅ 明确Skills开发的学习路径和资源✅ 准备好开始你的第一个Skills开发项目 一、Skills是什么&#xf…...