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
英文地址,請注明出處:http://en.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(主函…