主頁 > 軟體設計 > 翻譯:REST 和 gRPC 詳細比較

翻譯:REST 和 gRPC 詳細比較

2023-06-11 08:02:35 軟體設計

譯者注:在微服務架構設計,構建API和服務間通信技術選型時,對 REST 和 gRPC 的理解和應用還存在知識盲區,近期看到國外的這篇文章:A detailed comparison of REST and gRPC,將二者進行了詳細對比,周末有時間翻譯過來,希望能幫到大家!

很長一段時間以來,REST是構建API的唯一“標準”,近年來,出現了新的替代方案,2015年,臉書發布了GraphQL,2016年谷歌緊隨其后發布了gRPC,被廣泛使用,在本文中,將關注gRPC,并將其與REST進行比較,

概述

下表將概述本文討論的要點,并顯示 REST 和 gRPC 真正的亮點,

主題 REST gRPC
標準化 無標準 定義明確
范式 以資源為中心 以服務方法為中心
服務模式 一元流 一元流、客戶端流、服務器流和雙向流
要求 任何 HTTP、Json決議 編程語言需要支持 HTTP/2, gRPC
API 設計 代碼優先 設計優先
默認資料格式 Json Protobuf
WEB瀏覽器支持 瀏覽器本地支持 gRPC WEB
工具 成熟的工具 特定編程語言工具

標準化

REST 缺點之一是缺乏標準化,與其說 REST 是一個API標準,不如說是一種范式,許多人在談論它時都有不同的含義,對大多數人來說,術語“REST API”是基于HTTP的JSON API;對于其他規范,REST 可以與某些規范(如:HATEOAS或 JSON:API)互換使用,

REST這個術語甚至與HTTP無關,在使用 REST API 時,可能會導致很多混亂,例如,即使沒有明確定義,使用者可能會期望某些 REST API 端點的冪等性或可快取性,

相比之下,gRPC定義得很好,例如,基于 HTTP/2 的gRPC實作非常詳細,

基本差異

REST 和 gRPC 的范式并不相同,

REST 一切都以資源為中心,這些資源可以被檢索和操作,如果以圖書作為示例資源,REST API通常會提供以下端點:

  • GET /books :檢索所有書,可帶有篩選和分頁結果的引數
  • GET /books/{id} :檢索指定ID書
  • POST /books :創建書
  • DELETE /books/{id} :洗掉書

大多數基于 HTTP 的 REST API 都遵循這種模式,這很好,但某些情況很難表示為 REST API,例如,如果想創建多本書,而不想為每本書重復呼叫 POST/books(出于性能、冪等性或其他原因),該怎么辦?是否應該創建 POST/books/batch 端點?這還是“RESTful”嗎?雖然在技術上容易解決,但開發人員之間經常會進行長時間的討論,

另一方面,gRPC是一個RPC框架,以服務方法為中心,如果以圖書 API為例,使用gRPC,將使用以下方法創建 BookService

  • GetBooks()
  • GetBook()
  • CreateBook()
  • DeleteBook()

可以隨心所欲地命名這些方法,并設定任何需要的引數,如果現在想添加一個方法來創建多本書,沒有什么能阻止我們添加 CreateBooks() 方法,gRPC 在設計 API 時提供了更多的“自由”,因為有更少的(自我強加的)限制,

服務模式

gRPC 支持四種服務方法:

  • 一元流:發送單個請求,接收單個回應,
  • 服務器流:發送單一請求,接收多個回應,
  • 客戶端流:發送多個請求,接收單一回應,
  • 雙向流:發送多個請求,接收多個回應,

與只支持一元請求的 REST 相比,gRPC 有一個非常好的優勢,在 REST API 中支持其他服務模式需要使用不同的協議,例如:服務器發送的事件或websocket,這不是很“RESTful”,

要求

REST API通常“只適用于”任何型別的 HTTP 版本,只要一種編程語言有一個 HTTP 客戶端和一個用于 JSON 決議的庫,那么使用 REST API 就輕而易舉了,

gRPC 明確需要 HTTP/2 支持,否則它將無法作業,近年來,由于大多數框架都增加了對 HTTP/2 的支持,這已經不再是一個問題了,

由于 gRPC 需要生成代碼(用于創建客戶端或服務器存根),因此區域分編程語言支持,查看編程語言串列,

API 設計

REST API 通常是其實作的結果,稱為“代碼優先(code-first)”,雖然可以先用 OpenAPI 設計API,然后生成服務器存根,但這不是許多開發人員采用的方法,如果有一個 OpenAPI 定義,那么 OpenAPI 定義很可能是從 API 實作生成的,因此,API定義與實作緊密耦合,模型類的更改可能會導致 API 更改,無意中破壞介面規范,

gRPC 使用不同的方法,在實作API之前必須定義API(稱為“設計優先(design-first)”),然后根據 API 定義生成客戶端和服務器存根,這需要提前考慮,因為不能直接實作API,

兩種方法各有利弊,通常 REST API 方法允許快速迭代;使用gRPC,在調整 API 實作之前首先更改 API 定義,這可能會很煩人,然而,通過顯式定義API更加安全,API變動沒那么隨意,

資料格式

REST 和 gRPC 都可以使用不同的格式來傳輸資料,大多數 REST API 使用JSON,而 gRPC 默認使用 Protocol Buffers,一種輕便高效的結構化資料存盤格式,因此我們將比較這兩者,

JSON 對資料型別的支持有限,例如,大數字需要表示為字串,JOSON 是一種文本格式,便于閱讀,欄位名序列化會占用一些空間,在一些編程語言中,還需要使用反射來反序列化 JSON 訊息,速度慢,

如上所述,gRPC API 和相應的訊息型別首先被定義為 Protocol Buffers ,每條訊息都是強型別的,對于支持的編程語言,可以自動生成代碼以(反)序列化訊息,由于它是一種二進制格式,并且不序列化欄位名,因此它使用的空間比等效的JSON訊息少,但是存在缺點:即序列化訊息不可讀,并且需要 Protobuf 定義來反序列化訊息,可能會影響開發人員的體驗,

下面的 JSON 示例將占用大約66個位元組(去掉空白),

{
  "persons": [
    {
      "name": "Max",
      "age": 23
    },
    {
      "name": "Mike",
      "age": 52
    }
  ]
}

等效的序列化 protobuf 訊息將僅使用19個位元組

0x0A070A034D617810170A080A0448616E731034

大訊息

Protobuf 設計用于序列化和反序列化記憶體中的訊息,因此,不建議使用 Protobuf/gRPC 傳輸巨大的訊息,大多數 gRPC 實作對單個訊息的默認限制為4MB

使用 REST API 處理大資料量(例如檔案上傳)是相當直接的,接收到的檔案可以被視為,只需使用很少的記憶體,這在 gRPC 中需要更多的操作:檔案必須在發送方分為幾個部分,然后,每個塊將作為單獨的訊息通過客戶端流傳輸方法發送到服務器,服務器接收每個塊,并構造資料流,從而產生與 REST API 類似的行為,

瀏覽器兼容性

瀏覽器兼容是 REST 真正的閃光點,它由 WEB 瀏覽器本地支持,因此可以輕松地使用 WEB應用程式中的 REST API,

gRPC 不直接由瀏覽器支持,因為它需要明確的 HTTP/2 支持和訪問某些 HTTP/2 功能,而 WEB瀏覽器不提供這些功能,作為一種變通方法,可以使用 gRPC Web 協議,使其可供 WEB 瀏覽器使用,對于某些編程語言,框架中已經包含了gRPC Web 支持,對于其他場景,需要一個代理來將 gRPC 流轉換為 gRPC Web 流,反之亦然,與不需要依賴關系的 REST API 相比,gRPC API 在 WEB 上使用更麻煩,

解決方法可以是使用 JSON 轉碼,這允許開發人員將 gRPC API 公開為 REST API,

工具

gRPC 和 REST 工具在編程語言和框架之間差異很大,在某些情況下,gRPC 感覺更“原生”,而在另一些情況下,REST 工具則更高級,
對 gRPC 的編程語言支持更為重要,因為需要工具來生成特定編程語言的客戶端和服務器存根,對于不受支持的編程語言,不建議使用 gRPC ,

由于 REST API 存在的時間要長得多,因此存在更多有助于構建、測驗和部署 REST API 的工具,它們的功能通常比 gRPC 工具更高級,

小結

對于“應該使用 REST 還是 gRPC ?” 沒有明確的答案,有些 API 有獨特的用例,gRPC 或 REST 可能更適合這些用例,

REST 和 gRPC 都有各自的優點和缺點,

WEB 應用程式中使用 REST API 通常更容易,REST也得到了更廣泛的使用,這使得開發人員使用它更簡單,

gRPC 在服務器到服務器的通信(例如:微服務之間)方面無疑具有優勢,能夠共享準確的API定義并用多種編程語言創建 API 客戶端,這是一個巨大的優勢,

dotNET兄弟會-公眾號

專注.Net開源技術及跨平臺開發!致力于構建完善的.Net開發技術文庫!為.Net愛好者提供學習交流家園!

image

記錄技術修行中的反思與感悟,以碼傳心,以軟制道,知行合一!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/554876.html

標籤:領域驅動設計

上一篇:驅動開發:內核檔案讀寫系列函式

下一篇:返回列表

標籤雲
其他(160771) Python(38219) JavaScript(25492) Java(18216) C(15237) 區塊鏈(8270) C#(7972) AI(7469) 爪哇(7425) MySQL(7245) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5873) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4589) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2435) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) 功能(1967) HtmlCss(1961) Web開發(1951) C++(1933) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1880) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 翻譯:REST 和 gRPC 詳細比較

    >譯者注:在微服務架構設計,構建API和服務間通信技術選型時,對 REST 和 gRPC 的理解和應用還存在知識盲區,近期看到國外的這篇文章:[A detailed comparison of REST and gRPC](https://kreya.app/blog/rest-vs-grpc/), ......

    uj5u.com 2023-06-11 08:02:35 more
  • 驅動開發:內核檔案讀寫系列函式

    在應用層下的檔案操作只需要呼叫微軟應用層下的`API`函式及`C庫`標準函式即可,而如果在內核中讀寫檔案則應用層的API顯然是無法被使用的,內核層需要使用內核專有API,某些應用層下的API只需要增加Zw開頭即可在內核中使用,例如本章要講解的檔案與目錄操作相關函式,多數ARK反內核工具都具有對檔案的... ......

    uj5u.com 2023-06-10 08:40:42 more
  • 驅動開發:內核檔案讀寫系列函式

    在應用層下的檔案操作只需要呼叫微軟應用層下的`API`函式及`C庫`標準函式即可,而如果在內核中讀寫檔案則應用層的API顯然是無法被使用的,內核層需要使用內核專有API,某些應用層下的API只需要增加Zw開頭即可在內核中使用,例如本章要講解的檔案與目錄操作相關函式,多數ARK反內核工具都具有對檔案的... ......

    uj5u.com 2023-06-10 08:38:56 more
  • 詳解驅動開發中內核PE結構VA與FOA轉換

    摘要:本文將探索內核中決議PE檔案的相關內容。 本文分享自華為云社區《驅動開發:內核PE結構VA與FOA轉換》,作者: LyShark 。 本章將探索內核中決議PE檔案的相關內容,PE檔案中FOA與VA、RVA之間的轉換也是很重要的,所謂的FOA是檔案中的地址,VA則是記憶體裝入后的虛擬地址,RVA是 ......

    uj5u.com 2023-06-09 08:19:23 more
  • 詳解驅動開發中內核PE結構VA與FOA轉換

    摘要:本文將探索內核中決議PE檔案的相關內容。 本文分享自華為云社區《驅動開發:內核PE結構VA與FOA轉換》,作者: LyShark 。 本章將探索內核中決議PE檔案的相關內容,PE檔案中FOA與VA、RVA之間的轉換也是很重要的,所謂的FOA是檔案中的地址,VA則是記憶體裝入后的虛擬地址,RVA是 ......

    uj5u.com 2023-06-09 08:18:39 more
  • 驅動開發:內核封裝WFP防火墻入門

    WFP框架是微軟推出來替代TDIHOOK傳輸層驅動介面網路通信的方案,其默認被設計為分層結構,該框架分別提供了用戶態與內核態相同的AIP函式,在兩種模式下均可以開發防火墻產品,以下代碼我實作了一個簡單的驅動過濾防火墻。WFP 框架分為兩大層次模塊,用戶態基礎過濾引擎`BFE (BaseFilteri... ......

    uj5u.com 2023-06-08 09:34:53 more
  • 移動應用架構新思路——WePY+小程式容器

    WePY(微信小程式開發框架)是一個基于組件化開發思想的微信小程式開發框架。它類似于Vue.js框架,通過封裝小程式原生的API,提供了更加簡潔、高效的開發方式。 WePY的主要特點包括: 組件化開發:WePY將頁面拆分為多個組件,每個組件有自己的樣式、模板和邏輯。這種組件化的開發方式能夠提高代碼的 ......

    uj5u.com 2023-06-08 09:34:45 more
  • 如何做架構設計?

    我們要尋求更好的技術方案,推動架構的良性演進,每一步都是經過深度思考的,而架構設計方法就是幫助我們思考的框架。通過做架構設計,我們應該提升軟體的質量和效率,降低風險和成本。 ......

    uj5u.com 2023-06-08 09:34:40 more
  • AI人工智能領域精美繪圖模板分享

    ![cover.jpeg](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e86fc6dcb452419498a7db6878591e30~tplv-k3u1fbpfcp-watermark.image?) #### 1 人工智能的發展歷程 如今 ......

    uj5u.com 2023-06-08 09:34:36 more
  • 當“代碼農”遇上“碼農”:揭秘主干開發的那些事兒

    前段時期我負責部門內部主干開發落地相關事宜,這個程序中,也真真切切的體會到了多人開發程序中,面對特性分支管理中,大家遇到的一些困擾,尤其面對敏捷迭代的開發方式,合并沖突,集成測驗,代碼重用等方面,都與高效兩個字背離。當然,我在推進主干開發程序中,也遇到了一些問題和坎坷,在這里,集中的做一次分享。 ......

    uj5u.com 2023-06-08 09:34:30 more