一個gRPC-go範例程式

changjixiong發表於2018-01-13

grpc-go 的介紹:

The Go implementation of gRPC: A high performance, open source, general RPC framework that puts mobile and HTTP/2 first.

github 地址

https://github.com/grpc/grpc-go

注意看 readme 中的安裝方式 go get -u google.golang.org/grpc,此處可能需要全域性科學上網。

google 提供的範例

https://github.com/grpc/grpc-go/tree/master/examples

寫個測試程式試試,完整的程式碼見https://github.com/changjixiong/goNotes/tree/master/grpcnotes

建立子目錄 hello,在目錄 hello 中建立一個 hello.proto 檔案,對著 exmaples 中的 helloworld 依葫蘆畫瓢:

syntax = "proto3";

package hello;

service Hello { rpc SayHello (HelloRequest) returns (HelloReply) {} }

message HelloRequest { int32 num = 1; }

message HelloReply { string message = 1; }

在目錄 grpcnotes 下執行 protoc -I hello/ hello/hello.proto --go_out=plugins=grpc:hello

生成 hello.pb.go 檔案

按同樣的步驟在建立一個 world。

建立子目錄 echo,在目錄 echo 中建立一個 echo.proto 檔案,對著 exmaples/route_guide/routeguide/route_guide.proto 檔案抄一個 stream 模式的定義:

syntax = "proto3";

package echo;

service Echo { rpc SayEcho (EchoRequest) returns (EchoReply) {} rpc SayEchoS(stream EchoRequest) returns (stream EchoReply) {} }

message EchoRequest { int32 num = 1; }

message EchoReply { string message = 1; }

在目錄 grpcnotes 下執行 protoc -I echo/ echo/echo.proto --go_out=plugins=grpc:echo

生成 echo.pb.go 檔案。

按照 exmaples/helloworld/greeter_server/main.go 的例子抄一個,由於這裡有 3 個 protobuf 物件,所以程式碼略有不同:

s := grpc.NewServer( grpc.KeepaliveParams(keepalive.ServerParameters{}), grpc.MaxConcurrentStreams(10000)) pb.RegisterHelloServer(s, &serverHello{}) pb2.RegisterWorldServer(s, &serverWorld{}) pb3.RegisterEchoServer(s, &serverEcho{}) // Register reflection service on gRPC server. reflection.Register(s)

client 參考 exmaples/helloworld/greeter_client/main.go,增加了併發呼叫,引數風格參考 ab 測試

編譯伺服器程式命名為 grpcserver,編譯客戶端程式命名為 grpcclient。

執行 ./grpcserver

執行 ./grpcclient -c 1000 -n 100000

輸出

550 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 400 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 500 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 50 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 900 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 150 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 300 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 200 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 650 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 250 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 750 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 600 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 800 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 350 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 0 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 850 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 950 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 450 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 100 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 700 sendokNum: 100 recvokNum 100 sendErrNum: 0 recvErrNum: 0 emptyNum: 0 cost: 3.96848528s

更多原創文章乾貨分享,請關注公眾號
  • 一個gRPC-go範例程式
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章