云原生應用開發之Go 中構建 gRPC
1.什么是 gRPC
gRPC 由谷歌開發的,是一種語言中立、平臺中立、開源的遠程調用過程。
什么是遠程調用過程?簡單理解就是公開本地應用給其他應用程序調用的方法。gRPC 是一項進程間通信技術,可以用來連接、調用、操作和調式分布式異構應用程序。也像 RPC 應用程序的特點一樣:像調用本地函數一樣。
2.特點
gRPC 是一個高性能、開源和通用的 RPC 框架,面向移動和 HTTP/2 設計,帶來諸如雙向流、流控、頭部壓縮、單 TCP 連接上的多復用請求等特。這些特性使得其在移動設備上表現更好,更省電和節省空間占用。
在 gRPC 里客戶端應用可以像調用本地對象一樣直接調用另一臺不同的機器上服務端應用的方法,使得您能夠更容易地創建分布式應用和服務。
gRPC 默認使用 protocol buffers,這是 Google 開源的一套成熟的結構數據序列化機制,它的作用與 XML、json 類似,但它是二進制格式,性能好、效率高(缺點:可讀性差)。
3.gRPC 和 REST 區別
它類似于 REST API 通信,通過它,您可以有效地將應用程序中的功能公開給使用 HTTP 連接作為通信媒介的其他應用程序。
雖然 REST 和 gRPC 有點相似,但您應該注意它們的工作方式存在區別:
gRPC 使用 HTTP/2 協議,而 REST 使用 HTTP 1.1
gRPC 使用協議緩沖區數據格式,而不是通常在 REST API 中使用的標準 JSON 數據格式
使用 gRPC,您可以根據需要利用 HTTP/2 功能,例如服務器端流式傳輸、客戶端流式傳輸甚至雙向流式傳輸。
4.Go 建立一個 gRPC 服務器
我們從在 Go 中定義一個非常簡單的 gRPC 服務器開始。一旦我們有一個簡單的服務器啟動并運行,我們就可以著手創建一個能夠與之交互的 gRPC 客戶端。
gRPC 可以實現微服務,將大的項目拆分為多個小且獨立的業務模塊,也就是服務,各服務間使用高效的protobuf 協議進行 RPC 調用,gRPC 默認使用 protocol buffers ,這是 google 開源的一套成熟的結構數據序列化機制(當然也可以使用其他數據格式如 JSON )。可以用 proto files 創建 gRPC 服務,用 message 類型來定義方法參數和返回類型
安裝 golang 的proto工具包:
在開始建立 gRPC 之前,確保已安裝 Protocol Buffers v3:
在 Go 中安裝 gRPC:
然后寫一個服務器,通過監聽 TCP 連接的端口。如下的 main 函數:
接下來,我們要從 golang.org 導入官方的 gRPC 包,以便我們可以創建一個新的 gRPC 服務器,然后注冊我們想要公開的端點,然后通過我們上面定義的現有 TCP 連接提供服務:
這是用 go 編寫的最基礎 gRPC 服務器,現在的功能還很有限。
5.添加一些功能
然后寫一個客戶端與前面的服務器進行交互,創建一個 client.proto 文件:
這個 .proto 文件公開了我們的 ChatService,它具有一個單獨的 SayHello 函數,可以由任何用任何語言編寫的 gRPC 客戶端調用。
這些 .proto 定義通常在各種形狀和大小的客戶端之間共享,以便它們可以生成自己的代碼來與我們的 gRPC 服務器通信。
讓我們使用 protoc 工具生成 Go 特定的 gRPC 代碼:
您會看到這將生成一個 chat/chat.pb.go 文件,該文件將包含生成的代碼,以便我們在代碼中輕松調用。讓我們更新我們的 server.go 來注冊我們的 ChatService,如下所示:
然后我們將必須定義 SayHello 方法,該方法將接收一條消息,讀取消息的正文,然后返回它自己的消息:
如果我們想為我們的 gRPC 服務器定義更高級的功能,那么我們可以通過定義一個基于我們的 Server 結構構建的新方法來實現,然后將該函數的名稱添加到我們的 chat.proto 文件中,以便我們的應用程序可以將其公開為某種東西其他 gRPC 客戶端可以訪問。
完成這些最終更改后,讓我們嘗試運行我們的服務器:
驚人的!我們現在在我們的機器上的 localhost:8000 上啟動并運行了一個嶄新的、閃亮的新 gRPC 服務器!
6在 Go 中構建 gRPC 客戶端
現在我們的服務器已經啟動并運行了,讓我們看看如何構建一個能夠與之交互的簡單客戶端。更新一下 client.go 文件:
當我們運行它時,我們應該看到我們的客戶端從服務器收到了一個非常好的 Hello 消息,如下所示:
我們已經成功創建了一個非常簡單的 gRPC 客戶端,它現在可以與我們的新 gRPC 服務器通信!
安裝問題
如果遇到 go get google.golang.org/grpc 安裝出錯,如下:
通過如下方式替換:
- git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
- git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
- git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
- go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
- git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
- cd $GOPATH/src/
- go install google.golang.org/grpc
7.總結
通過本文我們已經了解了如何在 Go 中構建一個簡單的 gRPC 客戶端和服務器。我們構建了一個基本服務器,它接受來自客戶端的傳入消息,然后向這些客戶端返回響應。