對比 HTTP-REST 與 gRPC:各自的優缺點以及適用的場景

文章目錄

  • 對比 HTTP-REST 與 gRPC:各自的優缺點以及適用的場景
    • HTTP-REST 與 gRPC 的核心區別
    • gRPC 的優缺點
    • HTTP-REST 的優缺點
    • 適用場景
  • 模糊點
    • 什么是 Protobuf?
    • HTTP/2 會將 HTTP 消息拆分并封裝為二進制幀,那還能過使用 HTTP/2 構建 RESTful 接口嗎?
    • 如果 HTTP/2 支持 RESTful 接口,那為什么還需要 gRPC 呢?

對比 HTTP-REST 與 gRPC:各自的優缺點以及適用的場景

在這里插入圖片描述
最近在總結近期學習的一個使用 gRPC + Gin 寫的 Golang 微服務項目,微服務的框架選用的是 gRPC,它是 RPC 的一種,可以讓客戶端像是在調用本地函數一樣對遠程服務器當中的函數進行調用。

通過對該項目進行學習,我個人感覺 gRPC 與 HTTP-REST 所做的工作非常的相似,即根據發起的請求,返回相應的結果,因此對二者的區別進行了詳細的調研,通過本篇文章進行簡要的總結。

HTTP-REST 與 gRPC 的核心區別

特性gRPCHTTP
協議基于 HTTP/2 通信通常基于 HTTP/1.1,但也可以使用 HTTP/2
數據格式默認使用 Protobuf 進行字節流的序列化與反序列化通常使用 JSON/XML
通信模式支持單向、雙向流式通信僅支持請求-響應,無流式
性能高(二進制編碼 + HTTP/2 多路復用)較低(文本解析 + HTTP/1.1 的無多路復用)
適用場景微服務之間的通信、實時流式數據Web API(返回 RESTful API 的數據給前端)、瀏覽器兼容場景

gRPC 的優缺點

?優點

  • 高性能:Protobuf 序列化和反序列化的編碼體積小,使用 HTTP/2 傳輸降低延遲;
  • 流式支持:適合實時數據傳輸(聊天、日志流);
  • 強類型接口:通過 .proto 文件明確定義服務和方法;
  • 跨語言支持:自動生成多客戶端語言。

?缺點

  • 瀏覽器支持差:需要 gRPC-Web 代理;
  • 調試復雜:二進制數據需要經過轉換才能為人所閱讀;
  • 生態工具較少:與 HTTP-REST 相比,gRPC 的工具鏈尚不成熟。

HTTP-REST 的優缺點

?優點

  • 通用性強:所有語言和平臺(甚至是 IoT)原生支持;
  • 可讀性好:使用 JSON/XML 格式進行數據傳輸,便于接口調試和日志記錄;
  • 瀏覽器友好:直接用于前端調用。

?缺點

  • 性能較低:基于純文本進行傳輸的效率較低,對純文本進行解析的成本也較高;
  • 無流式支持:HTTP-REST 僅支持通過請求-響應模式請求資源,不支持流式傳輸;
  • 弱類型約束:接口規范依賴于文檔。

適用場景

gRPC(HTTP/2 + Protobuf)
更適用于微服務之間的通信以及流式數據傳輸。

HTTP-REST(HTTP/1.1 或 HTTP/2 + JSON)

  • 瀏覽器直接調用 API:如果使用 gRPC 則還需要 gRPC-web 進行代理,但是如果此時使用 HTTP-REST 可以直接獲得 JSON 格式的數據;
  • 快速原型開發:JSON 很容易手動構造,而 protobuf 則需要編譯 .proto 文件;
  • 兼容舊系統:遺留系統可能不支持 gRPC,但基本都支持 HTTP + JSON。

模糊點

根據以上內容的總結,我產生了一些模糊點,在此列舉并深入研究一下。

什么是 Protobuf?

Protobuf(Protocol Buffers)可以被理解為一種高效的數據序列化與反序列化協議,它的核心作用是將結構化的數據(如對象或消息)轉換為二進制格式(序列化),或將字節流當中的二進制數據轉換為原始數據(反序列化)。

如果想要使用 gRPC 來建立微服務,那么所編寫的 proto 文件很有可能包含 service 和 message 兩部分,service 當中定義了具體的遠程過程調用函數,而 message 定義了 RPC 函數的請求結構體和響應結構體。

? Protobuf 的優點

  • 高性能:二進制編碼體積小,網絡傳輸與序列化和反序列化的時間開銷隨之降低;
  • 強類型與模式化:通過 proto 文件定義數據結構,避免運行時錯誤;
  • 跨語言支持:protobuf 官方支持多種語言,生成的代碼接口一致。

? Protobuf 的缺點

  • 需要預編譯:必須先定義 proto 文件并編譯生成相應語言的代碼,靈活性低于 JSON;
  • 可讀性差:二進制數據不能直接閱讀,如需調試需要借助工具;
  • 不適合所有場景:比如瀏覽器直接處理 Protobuf 格式的數據非常復雜,對于 gRPC 而言還需要借助 gRPC-web 代理才能過讀取,瀏覽器場景更適合直接使用 JSON 進行序列化與反序列化。

💡 Protobuf 的常見使用場景

  • 微服務通信:gRPC 默認使用 Protobuf 通信,替代 REST + JSON;
  • 高性能存儲:如數據庫緩存、日志存儲;
  • 跨語言數據交換:不同語言服務間傳遞結構化數據(當然這一點基于 JSON 也能做到)。

HTTP/2 會將 HTTP 消息拆分并封裝為二進制幀,那還能過使用 HTTP/2 構建 RESTful 接口嗎?

完全可以。因為 HTTP/2 只是 HTTP 協議的一個版本,它將 HTTP 消息(Header + Body)拆分為二進制幀只是為了優化傳輸效率(多路復用、頭部壓縮),但不改變 HTTP 的語義。

具體來說,應用層的原始數據(比如 JSON 或 XML,也可以是 Protobuf)不會被拆分為二進制幀,HTTP/2 將數據轉為二進制的時機是在將應用層數據通過傳輸層發送之前。在傳輸層發送字節流之前,HTTP/2 會將 HTTP 消息(Header + Body)拆分并封裝為二進制幀,從而管理多路復用和優先級,提升了傳輸以及序列化反序列化的效率。

如果 HTTP/2 支持 RESTful 接口,那為什么還需要 gRPC 呢?

雖然 HTTP/2 本身已經優化了傳輸效率,但是 gRPC 基于 HTTP/2 進行了進一步的優化,具體體現在使用 Protobuf 作為數據的編碼形式,為 HTTP/2 引入了強類型約束,并且具有高性能和跨語言的特性。

此外,HTTP/2 + REST-JSON 僅支持請求-響應模式,無法實現持續的數據流。

而 gRPC 原生支持 4 種通信模式:

  • Unary RPC(類似 REST,單一請求-響應);
  • Server Streaming RPC(服務端推送流,比如實時日志);
  • Client Streaming RPC(客戶端上傳流,如文件分塊上傳);
  • Bidirectional Streaming RPC(雙向流,如聊天應用)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81749.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81749.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

現代健康生活養生指南

現代社會中,熬夜加班、久坐不動、飲食不規律成為許多人的生活常態,由此引發的健康問題也日益增多。想要擺脫亞健康,不必依賴中醫理念,從以下這些現代科學養生方法入手,就能逐步改善身體狀況。? 飲食上,注…

Go語言數組的定義與操作 - 《Go語言實戰指南》

在 Go 語言中,數組(Array) 是一種定長、同類型的集合。它在內存中是連續分布的,適合用于性能敏感的場景。 一、數組的定義 數組的基本語法如下: var 數組名 [長度]元素類型 示例: var nums [5]int …

Helm Chart 中配置多個 Docker Registry 地址以實現備用訪問

在 Helm Chart 中配置多個 Docker Registry 地址以實現備用訪問,可以通過以下幾種方式實現: 1. 在 values.yaml 中定義多個 Registry 在 values.yaml 中定義主 Registry 和備用 Registry,以便在部署時靈活切換: # values.yaml …

云原生安全:錯誤策略S3存儲桶ACL設置為Everyone:FullControl

??「炎碼工坊」技術彈藥已裝填! 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 ——從基礎到實踐的深度解析 1. 基礎概念 S3存儲桶與ACL Amazon S3(Simple Storage Service)是AWS提供的對象存儲服務,支持存儲和檢索任意規模的數據。ACL(訪問控制列表…

.NET 8 kestrel 配置PEM,實現內網https

一、生成證書 mkcert 是一個簡單的工具,用于制作本地信任的開發證書。它不需要配置。 mkcert官方倉庫地址:GitHub - FiloSottile/mkcert: A simple zero-config tool to make locally trusted development certificates with any names youd like. 簡…

nodejs快速入門到精通1

參考 nodejs快速入門到精通 菜鳥教程-nodejs nodejs官方文檔 原因 視頻免費 資料收費 筆記還是自己寫吧 安裝 nodejs官網 windows下: #查看nodejs版本 node -v #查看npm版本 npm -v #設置npm為淘寶鏡像源 npm config set registry https://registry.npmmirror.…

nginx負載均衡及keepalive高可用

實驗前期準備: 5臺虛擬機:4臺當做服務器,1臺當做客戶機(當然,也可以使用主機的瀏覽器),4臺服務器中,2臺服務器當做后端真實訪問服務器;另外2臺服務器當做負載均衡服務器…

go語法大賞

前些日子單機房穩定性下降,找了好一會才找到真正的原因。這里面涉及到不少go語法細節,正好大家一起看一下。 一、仿真代碼 這是仿真之后的代碼 package mainimport ("fmt""go.uber.org/atomic""time" )type StopSignal…

Android 14 解決打開app出現不兼容彈窗的問題

應用安裝到 Android 14 上,出現如下提示 This app isn’t compatible with the latest version of Android. Check for an update or contact the app’s developer. 通過源碼找原因。 提示的字符 根據字符找到 ./frameworks/base/core/res/res/values/strings.xm…

Linux句柄數過多問題排查

以下是Linux句柄數過多問題的排查與解決方法整理&#xff1a; 一、檢測句柄使用情況 1?.查看系統限制? 單個進程限制&#xff1a;ulimit -n 系統級總限制&#xff1a;cat /proc/sys/fs/file-max 2?.統計進程占用量? 查看指定進程&#xff1a;lsof -p <PID> | wc -…

matlab插值方法(簡短)

在MATLAB中&#xff0c;可以使用interp1函數快速實現插值。以下代碼展示了如何使用spline插值方法對給定數據進行插值&#xff1a; x1 [23,56]; y1 [23,56]; X 23:1:56*4; Y interp1(x1,y1,X,spline);% linear、 spline其中&#xff0c;x1和y1是已知數據點&#xff0c;X是…

時間篩掉了不夠堅定的東西

2025年5月17日&#xff0c;16~25℃&#xff0c;還好 待辦&#xff1a; 《高等數學1》重修考試 《高等數學2》備課 《物理[2]》備課 《高等數學2》取消考試資格學生名單 《物理[2]》取消考試資格名單 職稱申報材料 2024年稅務申報 5月24日、25日監考報名 遇見&#xff1a;敲了一…

hexo博客搭建使用

搭建 Hexo 演示主題為&#xff1a;Keep 使用 文章 創建新文章 ? zymore-blog-keep git:(main) ? hexo new "告別H5嵌入&#xff01;uniApp小程序文件下載與分享完整解決方案" INFO Validating config INFO Created: ~/Desktop/HelloWorld/zymore-blog-k…

React組件開發流程-03.1

此章先以一個完整的例子來全面了解下React組件開發的流程&#xff0c;主要是以代碼為主&#xff0c;在不同的章節中會把重點標出來&#xff0c;要完成的例子如下&#xff0c;也可從官網中找到。 React組件開發流程 這只是一個通用流程&#xff0c;在熟悉后不需要完全遵從。 …

Cloudflare防火墻攔截谷歌爬蟲|導致收錄失敗怎么解決?

許多站長發現網站突然從谷歌搜索結果中“消失”&#xff0c;背后很可能是Cloudflare防火墻誤攔截了谷歌爬蟲&#xff08;Googlebot&#xff09;&#xff0c;導致搜索引擎無法正常抓取頁面。 由于Cloudflare默認的防護規則較為嚴格&#xff0c;尤其是針對高頻訪問的爬蟲IP&…

Ubuntu系統安裝VsCode

在Linux系統中&#xff0c;可以通過.deb文件手動安裝Visual Studio Code&#xff08;VS Code&#xff09;。以下是詳細的安裝步驟&#xff1a; 下載.deb文件 訪問Visual Studio Code的官方網站。 在下載頁面中&#xff0c;找到適用于Linux的.deb文件。 根據你的系統架構&…

降本增效雙突破:Profinet轉Modbus TCP助力包布機產能與穩定性雙提升

在現代工業自動化領域&#xff0c;ModbusTCP和Profinet是兩種常見的通訊協議。它們在數據傳輸、設備控制等方面有著重要作用。然而&#xff0c;由于這兩種協議的工作原理和應用環境存在差異&#xff0c;直接互聯往往會出現兼容性問題。此時&#xff0c;就需要一種能夠實現Profi…

Python對JSON數據操作

在Python中&#xff0c;對JSON數據進行增刪改查及加載保存操作&#xff0c;主要通過內置的json模塊實現。 一、基礎操作 1. 加載JSON數據 ? 從文件加載 使用json.load()讀取JSON文件并轉換為Python對象&#xff08;字典/列表&#xff09;&#xff1a; import json with open…

Linux詳解基本指令(一)

?? 歡迎大家來到小傘的大講堂?? &#x1f388;&#x1f388;養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; 所屬專欄&#xff1a;LInux_st 小傘的主頁&#xff1a;xiaosan_blog 制作不易&#xff01;點個贊吧&#xff01;&#xff01;謝謝喵&#xff01;&a…

Node-Red通過Profinet轉ModbusTCP采集西門子PLC數據配置案例

一、內容簡介 本篇內容主要介紹Node-Red通過node-red-contrib-modbus插件與ModbusTCP設備進行通訊&#xff0c;這里Profinet轉ModbusTCP網關作為從站設備&#xff0c;Node-Red作為主站分別從0地址開始讀取10個線圈狀態和10個保持寄存器&#xff0c;分別用Modbus-Read、Modbus-…