grpc 和 http 的区别---二进制vsJSON编码
gRPC 和 HTTP 是两种广泛使用的通信协议,各自适用于不同的场景。以下是它们的详细对比与优势分析:
一、核心特性对比
| 特性 | gRPC | HTTP |
|---|---|---|
| 协议基础 | 基于 HTTP/2 | 基于 HTTP/1.1 或 HTTP/2 |
| 数据格式 | 默认使用 Protobuf(二进制) | 通常使用 JSON/XML(文本) |
| 传输效率 | 高(二进制编码 + 多路复用) | 较低(文本编码 + 无多路复用) |
| 流式支持 | 支持(客户端流、服务器流、双向流) | 有限(HTTP/2 支持 Server Push,但不如 gRPC 灵活) |
| 代码生成 | 支持(通过 Protobuf 生成客户端/服务端代码) | 无(需手动编写客户端/服务端代码) |
| 跨语言支持 | 优秀(官方支持多种语言) | 优秀(几乎所有语言都支持 HTTP) |
| 适用场景 | 高性能、低延迟的微服务通信 | 通用 Web 服务、RESTful API |
二、gRPC 的优势
-
高性能
二进制编码:Protobuf 比 JSON/XML 更紧凑,序列化/反序列化速度更快。
多路复用:基于 HTTP/2,单个连接可并行处理多个请求,减少连接开销。
头部压缩:HTTP/2 的 HPACK 算法显著减少头部大小。
-
强类型接口
Protobuf 定义:通过 .proto 文件定义服务接口和消息格式,避免手动解析和验证。
代码生成:自动生成客户端和服务端代码,减少开发工作量。
-
流式通信
四种模式:
一元 RPC(Unary)客户端流(Client Streaming)服务器流(Server Streaming)双向流(Bidirectional Streaming)适用场景:实时数据传输(如聊天、日志流)。
-
跨语言支持
官方支持:C++, Java, Python, Go, Ruby, C#, Node.js 等。
一致性:不同语言生成的代码行为一致,减少跨团队协作成本。
-
内置功能
拦截器:支持中间件模式(如认证、日志、限流)。
超时与重试:内置机制,简化容错设计。
三、HTTP 的优势
-
通用性
广泛支持:几乎所有编程语言和框架都支持 HTTP。
工具生态:丰富的调试工具(如 Postman、curl)和监控方案(如 Prometheus)。
-
可读性
文本格式:JSON/XML 易于人类阅读和调试。
自描述性:无需额外定义接口文档(如 Swagger)。
-
兼容性
RESTful 风格:符合 Web 标准,易于与现有系统集成。
浏览器支持:直接用于前端与后端通信。
-
灵活性
无状态:适合分布式系统设计。
缓存支持:利用 HTTP 缓存机制(如 ETag、Cache-Control)提升性能。
-
部署简单
无需额外依赖:直接运行在 Web 服务器(如 Nginx、Apache)上。
防火墙友好:使用标准端口(80/443),无需特殊配置。
四、适用场景对比
| 场景 | 推荐协议 | 原因 |
|---|---|---|
| 微服务通信 | gRPC | 高性能、强类型、流式支持 |
| 实时数据传输 | gRPC | 双向流、低延迟 |
| 浏览器与后端通信 | HTTP | 浏览器原生支持 |
| 公开 API | HTTP | 通用性强、易于调试 |
| 跨平台数据交换 | HTTP | 文本格式易于解析 |
| 高性能内部系统 | gRPC | 二进制编码、多路复用 |
五、性能对比
-
延迟
gRPC:由于二进制编码和多路复用,延迟显著低于 HTTP(尤其是高并发场景)。
HTTP:文本编码和连接开销导致延迟较高。
-
吞吐量
gRPC:单连接可处理更多请求,适合高吞吐场景。
HTTP:受限于连接数和文本编码,吞吐量较低。
-
资源占用
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)…...
90,【6】攻防世界 WEB Web_php_unserialize
进入靶场 进入靶场 <?php // 定义一个名为 Demo 的类 class Demo { // 定义一个私有属性 $file,默认值为 index.phpprivate $file index.php;// 构造函数,当创建类的实例时会自动调用// 接收一个参数 $file,用于初始化对象的 $file 属…...
实现网站内容快速被搜索引擎收录的方法
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/6.html 实现网站内容快速被搜索引擎收录,是网站运营和推广的重要目标之一。以下是一些有效的方法,可以帮助网站内容更快地被搜索引擎发现和收录: 一、确…...
WSL2中安装的ubuntu搭建tftp服务器uboot通过tftp下载
Windows中安装wsl2,wsl2里安装ubuntu。 1. Wsl启动后 1)Windows下ip ipconfig 以太网适配器 vEthernet (WSL (Hyper-V firewall)): 连接特定的 DNS 后缀 . . . . . . . : IPv4 地址 . . . . . . . . . . . . : 172.19.32.1 子网掩码 . . . . . . . .…...
机器学习优化算法:从梯度下降到Adam及其变种
机器学习优化算法:从梯度下降到Adam及其变种 引言 最近deepseek的爆火已然说明,在机器学习领域,优化算法是模型训练的核心驱动力。无论是简单的线性回归还是复杂的深度神经网络,优化算法的选择直接影响模型的收敛速度、泛化性能…...
[SAP ABAP] 静态断点的使用
在 ABAP 编程环境中,静态断点通过关键字BREAK-POINT实现,当程序执行到这一语句时,会触发调试器中断程序的运行,允许开发人员检查当前状态并逐步跟踪后续代码逻辑 通常情况下,在代码的关键位置插入静态断点可以帮助开发…...
129.求根节点到叶节点数字之和(遍历思想)
Problem: 129.求根节点到叶节点数字之和 文章目录 题目描述思路复杂度Code 题目描述 思路 遍历思想(利用二叉树的先序遍历) 直接利用二叉树的先序遍历,将遍历过程中的节点值先利用字符串拼接起来遇到根节点时再转为数字并累加起来,在归的过程中…...
NCCL、HCCL、通信、优化
文章目录 从硬件PCIE、NVLINK、RDMA原理到通信NCCL、MPI原理!通信实现方式:机器内通信、机器间通信通信实现方式:通讯协调通信实现方式:机器内通信:PCIe通信实现方式:机器内通信:NVLink通信实现…...
unity学习21:Application类与文件存储的位置
目录 1 unity是一个跨平台的引擎 1.1 使用 Application类,去读写文件 1.2 路径特点 1.2.1 相对位置/相对路径: 1.2.2 固定位置/绝对路径: 1.3 测试方法,仍然挂一个C#脚本在gb上 2 游戏数据文件夹路径(只读&…...
17 一个高并发的系统架构如何设计
高并发系统的理解 第一:我们设计高并发系统的前提是该系统要高可用,起码整体上的高可用。 第二:高并发系统需要面对很大的流量冲击,包括瞬时的流量和黑客攻击等 第三:高并发系统常见的需要考虑的问题,如内存不足的问题,服务抖动的…...
Spring Boot 实例解析:配置文件
SpringBoot 的热部署: Spring 为开发者提供了一个名为 spring-boot-devtools 的模块来使用 SpringBoot 应用支持热部署,提高开发者的效率,无需手动重启 SpringBoot 应用引入依赖: <dependency> <groupId>org.springfr…...
pytorch图神经网络处理图结构数据
人工智能例子汇总:AI常见的算法和例子-CSDN博客 图神经网络(Graph Neural Networks,GNNs)是一类能够处理图结构数据的深度学习模型。图结构数据由节点(vertices)和边(edges)组成&a…...
计算机网络一点事(23)
传输层 端口作用:标识主机特定进程,TCP,UDP协议 端口号分类:服务器:0-1023,熟知 1024-49151 登记 客户端:49152-65535 功能:实现端到端,进程到进程的通信,…...
(9)下:学习与验证 linux 里的 epoll 对象里的 EPOLLIN、 EPOLLHUP 与 EPOLLRDHUP 的不同。小例子的实验
(4)本实验代码的蓝本,是伊圣雨老师里的课本里的代码,略加改动而来的。 以下是 服务器端的代码: 每当收到客户端的报文时,就测试一下对应的 epoll 事件里的事件标志,不读取报文内容,…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
