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