[gRPC] gRPC Getting Started
gRPC 說明影片 @ BESG
對應的程式碼可檢視 besg-grpc 的 repository。
gRPC 是什麼:以 Golang 說明與實作
RPC 的全名是 remote procedure call,主要是作為電腦和電腦間溝通使用。A 電腦可以呼叫 B 電腦執行某些程式,B 電腦會將結果回傳給 A 電腦,A 電腦在收到回應後會再繼續處理其他任務。RPC 的好處在於,雖然 A 電腦是發送請求去請 B 電腦做事,但其呼叫的方式,就很像是 A 電腦直接在呼叫自己內部的函式一般。
gRPC 也是基於這樣的概念,讓想要呼叫 server 處理請求的 client,在使用這支 API 時就好像是 呼叫自己內部的函式一樣簡單自然。從功能面來說,gRPC 就像 Web 常用的 Restful API 一樣,都是在處理請求和回應,並且進行資料交換,但 gRPC 還多了其他的功能和特色。
gRPC 是由 Google 開發的開源框架,它快速有效、奠基在 HTTP/2 上提供低延遲(low latency),支援串流,更容易做到權限驗證(authentication)。在下面的文章中,將會對於 gRPC 能提供的特色有更多說明。
Protocol Buffers 是什麼
- Protocol Buffers @ Google Developer
- Protocol Buffers 筆記 @ pjchender.dev
在學習 gRPC 時,需要同時了解什麼是 Protocol Buffers。在傳統的 Restful API 中,最常使用的資料交換格式通常是 JSON;但到了 gRPC 中,資料交換的格式則是使用名為 Protocol Buffers 的規範/語言。
也就是說,當我們想要使用 gRPC 的服務來交換資料前,必須先把資料「格式」和「方法」都定義清楚。
使用 gRPC 前,不只需要先把資料交換的格式定義清楚,同時也需要把資料交換的方法定義清楚。
這裡要稍微釐清一點很重要的是,Protocol Buffers 可以獨立使用,不一定要搭配 gRPC;但使用 gRPC 一定要搭配 Protocol Buffers。
實作將 Protocol Buffers 編譯成在 Golang 中可使用的檔案
對應的程式碼可檢視 besg-grpc repository 中的 proto 資料夾。
STEP 1:撰寫 Protocol Buffers 檔案
- 使用
message
定義資料交換的格式 - 使用
service
定義呼叫 API 的方法名稱
syntax = "proto3"; // 定義要使用的 protocol buffer 版本
package calculator; // for name space
option go_package = "proto/calculator"; // generated code 的 full Go import path
message CalculatorRequest {
int64 a = 1;
int64 b = 2;
}
message CalculatorResponse {
int64 result = 1;
}
service CalculatorService {
rpc Sum(CalculatorRequest) returns (CalculatorResponse) {};
}
STEP 2:安裝編譯 Protocol Buffer 所需的套件
此部份可參考 編譯 Protocol Buffers(Compiling) 段落。
安裝 compiler
# 安裝 compiler,安裝完後就會有 protoc CLI 工具
$ brew install protobuf
$ protoc --version # Ensure compiler version is 3+
# 安裝 protoc-gen-go 後可以將 proto buffer 編譯成 Golang 可使用的檔案
$ go get github.com/golang/protobuf/protoc-gen-go
# 安裝 grpc-go 後,可以在 Golang 中使用 gRPC
$ go get -u google.golang.org/grpc
STEP 3:編譯 Protocol Buffer 檔案
進到放有 .proto
檔的資料夾後,在終端機輸入下述指令:
$ protoc *.proto --go_out=plugins=grpc:. --go_opt=paths=source_relative