gRPC使用protocol buffers做爲 IDL(Interface Definition Language), 提供一種跨平臺,跨語言的RPC(遠程過程調用)機制,本文經過示例程序介紹gRPC基本使用。git
Go 版本1.6及以上 (傳送)github
$ go version
安裝gRPCgolang
$ go get -u google.golang.org/grpc
安裝 Protocol Buffers v3shell
Protocol編譯器是用來生成gRPC服務代碼的。下載對應的zip文件包來安裝便可 傳送。ide
接着安裝 protoc的Go插件:函數
$ go get -u github.com/golang/protobuf/protoc-gen-go
protoc-gen-go 編譯器插件安裝在$GOBIN,變量定義爲 \$GOPATH/bin,在$PATH環境變量中必須存在 protocol ,protoc相關命令。ui
$ export PATH=$PATH:$GOPATH/bin
下載gRPC示例代碼庫GIthub,示例代碼位於 $GOPATH/src/google.golang.org/grpc/examples 目錄下。google
$ go get google.golang.org/grpc #或者從github下載 $ go get github.com/grpc/grpc
#切換到示例代碼目錄中 $ cd $GOPATH/src/google.golang.org/grpc/examples
.proto 文件 定義 gRPC服務,同時也用來生成對應的 .pb.go 文件。 .pb.go 文件是使用 protoc 編譯器根據.proto來生成的。插件
對示例程序來講,helloworld.pb.go 文件已經提早生成(依據 helloworld.proto 定義),文件位於$GOPATH/src/google.golang.org/grpc/examples/helloworld/helloworldcode
文件 helloworld.pb.go 包含如下內容:
使用 go run 指令運行。
運行服務端:
$ go run greeter_server/main.go
運行客戶端(新開terminal):
$ go run greeter_client/main.go
若打印 Greeting: Hello world,表示基於 client-server 的 gRPC 運用運行成功。
目的:服務端(server)增長一個新的方法(SayHelloAgain)供客戶端(client)調用。gRPC服務使 protocol定義;在這個 地址 和這個 地址 能找到定義 .proto 文件的更多信息。如今,你只須要知道服務端和客戶端"stub"同時存在一個 SayHello 方法,該方法接受從客戶端 HelloRequest 類型參數而且由服務端返回 HelloReply 類型結果,代碼以下:
// greeting 服務定義. service Greeter { // 發送 greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // request 消息體包含 user's name. message HelloRequest { string name = 1; } // response 消息提包含 greetings message HelloReply { string message = 1; }
給 Greeter 增長一個 SayHelloAgain 方法,確保當前工做目錄爲$GOPATH/src/google.golang.org/grpc/examples/helloworld。
修改 helloworld/helloworld.proto 文件,增長一個 SayHelloAgain 方法,帶有 HelloRequest 和 HelloReply 類型。代碼以下:
// greeting 服務定義. service Greeter { // 發送 greeting rpc SayHello (HelloRequest) returns (HelloReply) {} // 新增 SayHelloAgain rpc SayHelloAgain (HelloRequest) returns (HelloReply) {} } // request 消息體包含 user's name. message HelloRequest { string name = 1; } // response 消息提包含 greetings message HelloReply { string message = 1; }
如今使用定義好的服務從新生成gRPC代碼。工做目錄爲($GOPATH/src/google.golang.org/grpc/examples/helloworld)。指令以下:
$ protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld
文件 helloworld.pb.go 被從新生成。
雖然已經從新生成 服務端 (server) 和 客戶端 (client) 代碼, 但讓然須要手動修改部分調用代碼。
編輯文件 greeter_server/main.go,增長以下代碼:
func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { return &pb.HelloReply{Message: "Hello again " + in.Name}, nil }
編輯文件 greeter_client/main.go,在 main 函數中增長以下代碼:
r, err = c.SayHelloAgain(ctx, &pb.HelloRequest{Name: name}) if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("Greeting: %s", r.Message)
運行服務端:
$ go run greeter_server/main.go
運行客戶端:
$ go run greeter_server/main.go
指望結果:
$ go run greeter_client/main.go Greeting: Hello world Greeting: Hello again world
完畢!