天天看點

gRPC快速入門(四)——gRPC快速入門gRPC快速入門(四)——gRPC快速入門

gRPC是一個高性能、通用的開源RPC架構,基于ProtoBuf(Protocol Buffers)序列化協定開發,且支援衆多開發語言,目前提供C、Java和Go語言版本,分别是grpc、grpc-java、grpc-go。gRPC提供了一種簡單的方法來精确地定義服務和為iOS、Android和背景支援服務自動生成可靠性很強的用戶端功能庫。gRPC基于HTTP/2标準設計,帶來諸如雙向流、流控、頭部壓縮、單TCP連接配接上的多複用請求等特性,使得gRPC在移動裝置上表現更好、更省電和節省空間占用。

gRPC優點如下:

(1)平台無關,語言無關,可擴充;

(2)提供了友好的動态庫,使用簡單;

(3)解析速度快,比對應的XML快約20-100倍;

(4)序列化資料非常簡潔、緊湊,與XML相比,其序列化之後的資料量約為1/3到1/10。

官方推薦安裝指令:

<code>go get google.golang.org/grpc</code>

國内網絡環境由于GFW原因,不能直接通路google伺服器,報錯如下:

<code>package google.golang.org/grpc: unrecognized import path "google.golang.org/grpc" (https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)</code>

是以,在國内網絡環境下推薦直接從GitHub下載下傳相應依賴進行安裝。

安裝gRPC:

<code>go install google.golang.org/grpc</code>

gRPC使用流程如下:

(1)編寫.proto描述檔案。

(2)編譯生成.pb.go檔案。

(3)服務端實作約定的接口并提供服務。

(4)用戶端按照約定調用方法請求服務。

一個RPC service是一個能夠通過參數和傳回值進行遠端調用的方法。由于gRPC通過将資料編碼成Protocal Buffer來實作傳輸,是以,使用者可以通過Protocal Buffers interface definitioin language(IDL)來定義service method,同時将參數和傳回值也定義成Protocal Buffer message類型。gRPC源碼目錄提供了多個使用示例,本文使用helloworld示例作為模闆,helloworld示例目錄位于<code>google.golang.org/grpc/examples/helloworld</code>。

在$GOPATH/src目錄下建立helloworld目錄,包含proto、server、client子目錄。proto目錄下建立helloworld.proto檔案。

helloworld.proto:

helloworld.proto檔案中定義了一個Greeter Service,服務包含一個SayHello方法,同時聲明了HelloRequest和HelloReply消息結構用于請求和響應。用戶端使用HelloRequest參數調用SayHello方法請求服務端,服務端響應HelloReply消息。

根據定義的RPC service,利用protocal buffer compiler,即protoc生成相應的伺服器端和用戶端的Go代碼,生成的代碼中包含了用戶端能夠進行RPC的方法以及伺服器端需要進行實作的接口。

在$GOPATH/src/helloworld/proto目錄下生成gRPC對應的Go代碼的指令如下:

<code>protoc --go_out=plugins=grpc:. helloworld.proto</code>

将在目錄下生成helloworld.pb.go檔案,内容如下:

生成檔案包含服務端接口GreeterServer描述,用戶端greeterClient接口及實作,以及HelloRequest、HelloResponse結構體。

在server子目錄下建立server.go檔案:

服務端引入編譯後的proto包,實作約定的SayHello接口方法,接口描述可以檢視helloworld.pb.go檔案中的GreeterServer接口描述。執行個體化grpc Server并注冊GreeterService,開始提供服務。

用戶端使用gRPC通路服務端:

用戶端初始化連接配接後直接調用聲明的方法,即可向服務端發起請求。

在server目錄下啟動Server:

<code>go run main.go</code>

在client目錄下啟動用戶端:

用戶端接收到服務端的響應:

<code>2018/12/17 20:03:44 Greeting: Hello world</code>