Stories

Detail Return Return

API 開發,gRPC 還是 GraphQL? - Stories Detail

什麼 GraphQL?

GraphQL 是一種針對 Graph(圖狀數據)進行查詢特別有優勢的 Query Language(查詢語言),所以叫做 GraphQL。它跟 SQL 的關係是共用 QL 後綴,就好像「漢語」和「英語」共用後綴一樣,但他們本質上是不同的語言。GraphQL 跟用作存儲的 NoSQL 沒有必然聯繫,雖然 GraphQL 背後的實際存儲可以選擇 NoSQL 類型的數據庫,但也可以用 SQL 類型的數據庫,或者任意其它存儲方式(例如文本文件、存內存裏等)。

GraphQL 接口是怎麼傳輸的?

imgGraphQL 接口傳輸

  1. 客户端構造 GraphQL 查詢語句,表示需要提取的數據結構,例如查詢某個用户的名字和年齡。
  2. 客户端以 JSON 格式封裝查詢語句,放在 HTTP POST 請求的 body 內,發送到服務器的 GraphQL endpoint。
  3. 服務器接收請求,驗證查詢語句語法無誤,分析客户端需要的數據。
  4. 服務器從數據源獲取對應數據,過濾出請求的字段,存為 JSON 對象。
  5. 服務器將包含響應數據的 JSON 通過 HTTP 返回給客户端。
  6. 客户端獲取響應,解析 JSON,提取到需要的 user 信息。

什麼是 gRPC?

gRPC 是一個由谷歌開發的現代開源高性能 RPC 遠程過程調用( Remote Procedure Calls)框架,可在多個開發環境下運行。它採用了領先的 HTTP/2 底層架構設計作為底層傳輸協議所以 gRPC 自然也包含了HTTP2 的優點:

  • 數據傳輸二進制分幀
  • 多路複用
  • 服務端推送
  • 頭部壓縮

gRPC 接口是怎麼傳輸的?

imggRPC

從上圖的 gRPC 傳輸模型可以看出,客户端 Stub 從 gRPC Core 庫發起請求,序列化成 Protobuf 消息格式,然後傳輸至服務端。

服務端 Stub 接收客户端請求,處理請求中的 Protobuf 數據並進行反序列化,然後將請求對象傳入服務器並實現業務邏輯處理。最終再將響應序列化後返回給客户端,從而形成一次完整的接口調用過程。

gRPC VS GraphQL

界面設計

gRPC 和 GraphQL,它們兩個都是屬於一類語言,他們都描述了計算機之間怎麼進行通信,其實就是界面描述語言(IDL),。它們適用於不同的編程語言,我們可以使用一些 工具來生成各種各樣語言的類型接口。GraphQL是與傳輸無關的,通常基於HTTP工作,而gRPC則基於HTTP2工作。

信息格式

  • gRPC 使用傳輸的格式是二進制,傳輸只包含數值,
  • GraphQL 傳輸的是 JSON 格式,它傳輸是基於文本的,它除了傳輸數值之外還包括其他字段名。
  • gRPC 消息比 GraphQL 消息小,因為二進制格式與較少的信息發送相結合。
  • gRPC 使用二進制格式還有另外一個好處,比 GraphQL 信息的序列化和解析更快。但是,也有很明顯的缺點,它相對於 JSON,更難調試和查看,因為 JSON 的信息結構更加清晰。

默認值

  • gRPC 的消息中不包括默認值,所以 gRPC 消息尺寸較小
  • GraphQL 可以設置參數的默認值,卻不能設置請求字段的默認值

請求格式

在 gRPC 中,我們一次只會調用一個方法。如果我們需要的數據比一個方法所返回的要多,就需要調用多個方法。如果我們需要第一個方法的響應數據,以便知道下一步調用哪個方法,那麼我們就會連續進行多次往返。除非我們和服務器在同一個數據中心,否則會造成很大的延遲。這個問題被稱為 underfetching,指請求的返回的數據信息不夠,這樣導致我們需要發多個請求去獲取數據。

向前兼容

gRPC 和 GraphQL 的向前兼容性,都很良好。

好處就是,可以用以前方式現有客户端的方式更新去個更新服務器。

傳輸

  • gRPC 支持支持服務器向客户端傳輸數據(serverstreaming)
  • GraphQL 支持服務器向客户端傳輸數據(Subscriptions)

使用 Apifox 發送 GraphQL

在 Apifox 創建 HTTP 項目。

img創建 HTTP 項目

在接口地址中輸入 GraphQL 的服務地址,然後發起請求。

img輸入 GraphQL 的服務地址

使用 Apifox 發送 gRPC 請求

如果你不習慣 Postman 的英文界面,你還可以嘗試另一個更加簡單便捷的接口測試工具——Apifox。Apifox 支持基於 .proto 文件的 gRPC 調試,包括一元調用和流式調用。

在創建項目時「選擇 gRPC 項目」-->「導入 .proto 文件」,無需寫代碼即可直接調用 gRPC 接口。

img創建 gRPC 項目

在調試 gRPC 接口之前,也需要先導入作為 API 定義的 .proto 文件。如果一個 .proto 文件依賴於其他 .proto 文件,那麼需要手動添加依賴關係目錄。

img導入 .proto 文件

一元調用

只需要在地址欄填寫 URL 後點擊「調用」按鈕,即可發起一元調用。

img一元調用

流式調用

流式調用包含服務端流、客户端流、雙向流

在發起調用之後,你可以在 Message 標籤下撰寫消息併發送,通過時間線視圖集中展示調用狀態、發送的消息、收到的消息。

img

user avatar dabizidekaohongshu Avatar meimaocudeshoudiantong Avatar zohocrm Avatar definecloud Avatar
Favorites 4 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.