gRPC 相关介绍

介绍

依赖两大技术

  1. HTTP/2 作为传输协议
    • gRPC 底层用 HTTP/2,它支持:
      • 多路复用(在一条 TCP 连接中并行传输多个请求和响应)
      • 二进制传输(更紧凑、高效)
      • 流式传输(客户端流、服务端流、双向流)
    • 相比传统 HTTP/1.1 的请求-应答模式,HTTP/2 能实现长连接、减少延迟。
  2. Protocol Buffers(Protobuf)作为序列化协议
    • gRPC 用 Protobuf 来定义服务接口和数据结构,传输数据时用 Protobuf 二进制序列化,这样数据体积小,解析速度快。

可以把 gRPC 看成:

  • 一种规范和框架,用 HTTP/2 来传数据
  • Protobuf 来描述和序列化接口数据
  • 最终形成一种轻量、高效、高性能的 RPC 协议

也就是说,gRPC 没有重新造一个底层网络协议,而是在 HTTP/2 之上构建标准化、高性能的 RPC 调用规范


💡 一句话总结:gRPC = RPC 框架(协议规范) + HTTP/2(传输层) + Protobuf(序列化格式)

HTTP/2

特性HTTP/1.1HTTP/2
传输方式基于纯文本基于二进制帧
连接复用一个连接只能串行传输一个请求(需多个 TCP 连接并发)单一 TCP 连接中支持多路复用(并行多个请求流,不再“队头阻塞”)
头部压缩没有使用 HPACK 算法压缩头部减少冗余
传输效率相对较低高(减少 RTT 延迟、减少资源浪费)
服务器推送没有有(服务端可主动向客户端推资源)
性能并行度差,需拼接多个域名或连接并行度高,减少 TCP 握手延迟,网络利用率更好

🔥 HTTP/2 性能为啥快?

  • 多个请求/响应在单一连接中同时传输 → 避免排队
  • 用二进制减少解析开销
  • HPACK 压缩请求头减少重复数据
  • 有流优先级控制,能保证重要资源先传完

💡 其实 Nginx 并不是直接把 HTTP/1.1 “升级”为 HTTP/2,而是

对外客户端提供 HTTP/2 支持

也就是:

  • 浏览器 → Nginx:用 HTTP/2
  • Nginx → 你的服务:可能是 HTTP/1.1,也可能是 HTTP/2

这种中间转换称为反向代理,它负责帮你让前端用户能用 HTTP/2,而你的后台服务暂时不用改。

FastAPI 底层用的是 UvicornHypercorn 这样的 ASGI 服务器。这些服务器默认只实现 HTTP/1.1,也就是浏览器跟你的服务之间是 HTTP/1.1。

  • 🔍 Uvicorn 默认:只支持 HTTP/1.1,不直接支持 HTTP/2
  • 🔍 Hypercorn:可以通过 TLS 配置支持 HTTP/2

✅ Uvicorn 自己目前只支持 HTTP/1.1,而要用 HTTP/2 就要用前端反代或者换成支持 HTTP/2 的服务器(如 Hypercorn)。

Protobuf

Protobuf(Protocol Buffers)Google 开发的一种二进制序列化协议,用来把结构化数据(像对象、消息、DTO)序列化成紧凑、高效的二进制流。

与 JSON 相比:

  • JSON:人可读(纯文本),体积大,序列化/反序列化较慢。
  • Protobuf:不可读二进制,需要 .proto 定义文件生成对应类,体积非常小,序列化/反序列化快
对比点JSONProtobuf
格式文本(UTF-8)二进制(紧凑)
消息定义无需预先定义需先定义 .proto
序列化体积小(字段编号、无冗余)
序列化速度快(直接写入二进制缓冲区)
易读性人可读不可读(需工具解码)
是否可压缩仍可 gzip也能 gzip(再小一层)

换句话说:

  • Protobuf 相当于把对象紧凑地按二进制序列化(去掉字段名,换成字段编号、可变长整型等),属于数据结构优化
  • gzip 相当于对一串二进制做通用压缩算法(熵编码/LZ77等),属于算法级压缩
{"a": "b","count": 123
}

定义消息规范,比如 my_data.proto:

syntax = "proto3";message MyData {string a = 1;int32 count = 2;
}
JSONProtobuf
{“a”: “b”, “count”: 123}b’\n\x01b\x10{'(二进制)
直接可读需用 .proto 定义结构
序列化速度较慢序列化速度快
体积大体积非常小

本地命令行测试公开gPRC

brew install grpcurl
grpcurl -plaintext grpcb.in:9000 list
  • grpcurl 工具
  • plaintext 表示用明文(非 TLS 加密),因为测试站点 grpcb.in:9000 没有启用 TLS
  • list 会列出该 gRPC 服务提供的所有服务名称。

返回结果:


addsvc.Add
grpc.gateway.examples.examplepb.ABitOfEverythingService
grpc.reflection.v1alpha.ServerReflection
grpcbin.GRPCBin
hello.HelloService

你先用 list grpcbin.GRPCBin 查看它的方法:

➜  ~ grpcurl -plaintext grpcb.in:9000 list grpcbin.GRPCBin
grpcbin.GRPCBin.DummyBidirectionalStreamStream
grpcbin.GRPCBin.DummyClientStream
grpcbin.GRPCBin.DummyServerStream
grpcbin.GRPCBin.DummyUnary
grpcbin.GRPCBin.Empty
grpcbin.GRPCBin.HeadersUnary
grpcbin.GRPCBin.Index
grpcbin.GRPCBin.NoResponseUnary
grpcbin.GRPCBin.RandomError
grpcbin.GRPCBin.SpecificError
➜  ~ grpcurl -plaintext grpcb.in:9000 grpcbin.GRPCBin/Empty
{}
➜  ~ grpcurl -plaintext -d '{}' grpcb.in:9000 grpcbin.GRPCBin/DummyUnary
{}

gRPC本质

本质上 gRPC 就是:

网络通信服务

用 HTTP/2 做底层传输,跨网络/不同语言之间调用

高性能序列化

用 Protobuf 把数据压缩成二进制流传过去(对比 JSON 快很多,也体积更小)

远程过程调用(RPC)

客户端像本地调用函数一样调用远程服务,gRPC 负责帮你打包、发送、等待返回

gRPC 就是让Go 调用 Python 函数 这么方便又快的工具!

比如:

  • 你有个 Python 模型服务,Go 微服务要用
  • 用 gRPC 定义接口
  • 两边各自用对应语言生成代码
  • 直接 stub.MyService.Method() 像本地函数一样调用,但是底层走网络传 Protobuf 消息

🧠 为什么大家喜欢 gRPC:

  1. 🏎 — 二进制流,HTTP/2 多路复用。
  2. 🧮 类型安全 — .proto 定义好了,生成各语言客户端。
  3. ⚖️ 通用 — Go/Python/Java/… 全部支持。

🎯 也就是:一份 .proto,多语言生成各自代码,这就是 gRPC 的核心

让不同语言像调用本地函数一样调用远程服务!

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

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

相关文章

PyTorch 模型镜像下载与安装指南

在国内,由于网络限制,直接从 PyTorch 官方源下载可能会遇到速度慢或无法访问的问题。为了解决这一问题,可以使用国内镜像源来加速下载和安装 PyTorch。 文章目录 安装指定版本的 PyTorch(以 CUDA 11.8 为例)安装 CPU 版…

2025年SVN学习价值分析

⚖️ 一、SVN的现状与应用场景分析 仍在特定领域发挥作用 传统企业维护场景:在金融、电信、政府等采用集中式开发流程的机构中,许多遗留系统仍使用SVN管理。这些系统往往体量庞大、架构稳定,迁移成本高,因此SVN短期内不会被完全替…

JavaScript中的10种排序算法:从入门到精通

作为前端开发者,排序算法是我们必须掌握的基础知识。无论是在面试中,还是在实际开发中处理数据展示时,排序都是一个常见需求。今天,我将用通俗易懂的方式,带你了解JavaScript中最常见的10种排序算法。 1. 冒泡排序 - …

【微信小程序】6、SpringBoot整合WxJava获取用户手机号

1、手机号快速验证组件 手机号快速验证组件 旨在帮助开发者向用户发起手机号申请,并且必须经过用户同意后,开发者才可获得由平台验证后的手机号,进而为用户提供相应服务。 该能力与手机号实时验证组件的区别为: 手机号快速验证…

redis8.0新特性:原生JSON支持详解

文章目录 一、写在前面二、使用1、基本命令(1)JSON.SET 设置 JSON 值(2)JSON.GET 获取 JSON 值(3)JSON.DEL 删除 JSON 值(4)JSON.MGET 批量获取(5)JSON.MSET …

QT网络调试助手开发全指南,软件设计图预研,后续文档跟进补充

网络调试助手 1 TCP网络调试助手 1.1 项目概述 网络相关的一些基础概念学习QTcpServer 学习QTcpClient 学习TextEdit特定位置输入文字颜色学习网络通信相关知识点 复习巩固之前UI控件 程序运行如下图所示 1.2 开发流程 1.3 QTtcp 服务器的关键流程 工程建立,需要在…

网络分层模型与协议体系技术研究报告

网络分层模型是计算机网络体系结构的核心框架,它通过将复杂的网络通信过程分解为多个层次,使网络设计、实现和维护变得更加模块化和标准化。 一、分层模型概念 1、OSI七层模型的详细解析 开放系统互连参考模型(OSI/RM)是国际标…

C++面向对象7——C继承与C++继承对比、C++继承详解

继承 C语言与C继承机制的对比与实现 一、C语言模拟继承的实现方法 C语言不支持面向对象编程的原生继承机制,但可以通过结构体嵌套和函数指针组合来模拟。 1. 结构体嵌套实现"is-a"关系 // 基类:Shape typedef struct {int x;int y; } Sha…

运维打铁: Windows 服务器基础运维要点解析

文章目录 思维导图一级节点:Windows 服务器基础运维要点 详细内容解析系统安装与配置硬件准备安装介质选择系统安装过程初始配置 日常监控与维护性能监控服务状态检查日志管理 安全管理账户与权限管理防火墙配置病毒防护 备份与恢复备份策略制定备份工具使用恢复测试…

Python实例题:基于量子计算的优化算法实现(量子计算、优化理论)

目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 扩展方向 Python实例题 题目 基于量子计算的优化算法实现(量子计算、优化理论) 问题描述 开发一个基于量子计算的优化算法实现,包含以下功能: 量子计…

基本算法--蓝桥杯备考

1.前缀和 1.定义 假设有一个数组a[n],要计算它的前j个元素的和为 a[0]a[1]...a[j-1] 时间复杂度为O(j),且随着j的变大时间复杂度越来越大。 使用了前缀和算法则为 sum[j]-sum[j-1] 时间复杂度是O(1),且数据越大优势越明显。 2.例题一 详解见《可…

pgsql 中各个字符串的区别

PostgreSQL 提供了多种字符串类型,它们在存储方式、长度限制和适用场景上有所不同。以下是主要字符串类型的详细对比和区别: 一、核心字符串类型对比 CHAR(n)/CHARACTER(n) 特点:固定长度字符串,不足部分用空格填充最大长度&…

ubuntu中lightdm干嘛的?

在 Ubuntu 或其他 Linux 发行版中,LightDM 是一个轻量级的 显示管理器(Display Manager),负责图形化登录界面、用户认证和会话启动。以下是它的核心作用、特点及类似替代品的对比: 1. LightDM 的核心作用 功能说明图形…

GraphQL注入 -- GPN CTF 2025 Real Christmas

part 1 服务器会每段时间禁用已注册的账号,此处存在漏洞 def deactivate_user_graphql(email):graphql_endpoint current_app.config["GRAPHQL_ENDPOINT"]query f"""mutation {{deactivateUser (user: {{email: "{email}"}}){{ success…

【机器学习深度学习】非线性激活函数

目录 前言 一、什么是激活函数? 1.1 作用 二、如果没有激活函数,会发生什么? 2.1 先看一张图理解“线性”的局限 2.2 核心认知:为什么非线性如此重要? 三、非线性激活函数到底解决了什么问题? 1. 引…

国外开源客服系统chathoot部署,使用教程

目录 一、系统版本要求: 二、部署步骤 2.1 安装docker 和docker-compose 2.2 准备docker-compose.yaml 2.3 初始化数据库 2.4 安装nginx 2.6 启动项目 三、使用教程 一、系统版本要求: linux ubuntu 22.042核4G 40GB(或以上&#xf…

什么是回归测试?什么时候需要做回归测试?

回归测试详解:概念、时机与最佳实践 1. 什么是回归测试? 回归测试(Regression Testing) 是指在对软件进行修改(如修复Bug、新增功能、优化代码)后,重新执行已有测试用例,以确保&am…

Android-Layout Inspector使用手册

Layout Inspector Android Layout Inspector 是 Android Studio 中用于调试应用布局的工具 启动方法: 通过下载Layout Inspector插件,在 “View - Tool Windows - Layout Inspector” 或 “Tools - Layout Inspector” 启动。 主要界面区域&#xff1a…

postgreSQL 数据库字典导出工具

为满足项目验收文档需求,开发了一个基于Python的PostgreSQL数据字典导出工具。 废话不多说,先分享一下 软件截图 数据字典文件样式,文件格式为docx 软件源码 基于python开发, import tkinter as tk from tkinter import ttk, messagebox …

【AI解析】 CppNumericalSolvers:一个现代化的 C++17 纯头文件优化库 示例代码解析

一个轻量级仅头文件的 C17 库,提供针对(无)约束非线性函数及表达式模板的数值优化方法 https://github.com/PatWie/CppNumericalSolvers CppNumericalSolvers 库 include 目录下的文件及其功能说明 根目录文件 文件名功能说明function.h(主函…