grpc 和 http 的区别:二进制 vs JSON 编码
创作时间:
作者:
@小白创作中心
grpc 和 http 的区别:二进制 vs JSON 编码
引用
CSDN
1.
https://m.blog.csdn.net/cpxsxn/article/details/145407180
gRPC和HTTP是两种广泛使用的通信协议,各自适用于不同的场景。本文将详细对比它们的核心特性、优势、适用场景以及性能表现,并通过实际案例展示二进制编码与JSON编码的区别。
一、核心特性对比
特性 | 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 文件定义数据结构,确保类型安全。
热门推荐
川味红烧猪脚:一道色香味俱佳的美容养颜佳肴
南宁青秀山冬季美景推荐:千年苏铁园、兰园、雨林大观等你探秘
南宁秋日摄影打卡:青秀山、南湖公园、民族广场
南宁旅游全攻略:广西三月三&五一必打卡
长白山人参种植:砂质壤土、pH5.5-6.5是高产关键
饮食调整助力情绪管理:六种营养素助你吃出好心情
AI技术在医疗和金融领域的革命性应用
中年电脑入门:硬件软件使用与安全上网一文通
三维扫描助力智能制造,工厂数字化转型新利器
职场新人如何通过持续学习加速职业发展
软硬兼修:中年职场人如何实现技能与关系双赢
告别中年危机:从身体到心理的全方位健康管理
AI助手助力企业HR管理,效率翻倍!
除夕“打醋坛”,门楣贴窗花:西固春节里的文化传承
丹生砂生爆红,《天降女子》再掀热潮
中科院成都生物研究所揭秘丹参酮合成奥秘,为心脑血管疾病治疗提供新思路
泉州最美海岸线:惠屿岛&南门海岸打卡指南
清源山:泉州必打卡的自然与历史宝藏
泉州天后宫:千年古刹见证海上丝路辉煌
儒家仁爱礼治修身:破解现代道德困境的实践方案
从孔子德政观看现代社会治理:以德化人,依法治国
手机进水后第一时间该怎么做?专业维修师教你四步处理法
腰椎间盘突出患者饮食指南:鲑鱼等5种食材助力缓解症状
腰椎间盘突出伴焦虑抑郁?六大方案助你重拾健康心态
专家推荐:腰椎间盘突出六大运动疗法全解析
揭秘中山王徐达:朱元璋追封背后的功绩
商标注册优先权:保护在先申请人的法律利器
巴黎公约下的商标优先权:如何在全球保护你的品牌
从健康防护到友好小区,多方合力改善外卖骑手工作环境
朱棣靖难之役背后的惊人真相揭秘