iT邦幫忙

2025 iThome 鐵人賽

DAY 22
0
自我挑戰組

API 全攻略系列 第 22

Day 22:gRPC 簡介

  • 分享至 

  • xImage
  •  

前言

在前面 21 天的學習中,我們專注在 RESTful API 的設計與實作。然而,在一些高效能、跨語言或微服務架構的情境下, REST API 可能不是最佳選擇 。今天,我們來認識另一種強大的 API 通訊方式 —— gRPC


gRPC 是什麼?

gRPC(Google Remote Procedure Call) 是 Google 開發的高效能、開源 RPC 框架。它基於 HTTP/2Protocol Buffers(protobuf) ,用來在不同系統之間進行高效能的通訊。

簡單來說:

  • REST 是 資源導向 (以 URL 表達資源,像 /users/1)。
  • gRPC 是 動作導向 (直接呼叫方法,像 GetUser(id=1))。

gRPC 的關鍵特點

1. 使用 HTTP/2

  • 支援多工(Multiplexing),一條連線可處理多個請求。
  • 支援伺服器端推送(Server Push)。

2. 使用 Protobuf

  • Protobuf(Protocol Buffers)是一種序列化資料格式,效能比 JSON 更好。
  • 定義好 .proto 檔後,可以自動生成不同語言的程式碼。

3. 跨語言支援

  • gRPC 官方支援 C++、Java、Python、Go、Node.js、C# 等多種語言。
  • 適合微服務環境下「不同服務用不同語言」的場景。

4. 支援多種通訊模式

  • Unary RPC :一問一答(類似 REST)。
  • Server Streaming :伺服器持續回傳資料。
  • Client Streaming :客戶端持續傳送資料。
  • Bidirectional Streaming :雙向持續傳輸,像聊天應用。

gRPC 與 REST 的比較

特點 REST gRPC
通訊協定 HTTP/1.1 HTTP/2
資料格式 JSON/XML Protobuf(二進位,更快更小)
設計導向 資源導向(URI) 動作導向(函式呼叫)
效能 可讀性高,但資料大 高效能,序列化後體積小
語言支援 廣泛,基本無需工具 需安裝 Protobuf 工具,但支援多語言
常見應用 Web API、第三方 API 微服務、內部系統通訊、即時系統

gRPC 的簡單範例

假設我們要建立一個 User 服務
先撰寫 .proto 檔案:

syntax = "proto3";

service UserService {
  rpc GetUser (UserRequest) returns (UserResponse);
}

message UserRequest {
  int32 id = 1;
}

message UserResponse {
  int32 id = 1;
  string name = 2;
}

接著:

  1. 用 protoc 生成程式碼(不同語言自動生成 Client 與 Server stub)。
  2. 在伺服器端實作 GetUser 方法。
  3. 在客戶端直接呼叫 GetUser({id: 1}),就像本地函式呼叫一樣。

gRPC 適合的使用場景

1. 微服務架構

不同服務(可能用不同語言)需要高效能的互相溝通。

2. 即時系統

需要雙向串流的應用(聊天、即時推播)。

3. 高效能內部 API

公司內部系統之間,效能比可讀性更重要。


gRPC 的限制與挑戰

  • 學習成本較高 :需要學 Protobuf 與 gRPC 工具鏈。
  • 瀏覽器支援度低 :瀏覽器原生不支援 gRPC,需要 gRPC-Web。
  • 可讀性差 :Protobuf 是二進位格式,除錯不像 JSON 那麼直觀。

小結

今天我們快速認識了 gRPC:

  • 基於 HTTP/2 + Protobuf 的高效能通訊框架。
  • 相較於 REST,更適合 微服務、跨語言、高效能 場景。
  • 但在 瀏覽器友善度與可讀性 上不如 REST。

上一篇
Day 21:API 測試自動化(使用 Jest / Supertest)
下一篇
Day 23:WebSocket 與即時 API
系列文
API 全攻略24
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言