gRPC golang 初步接觸

概述

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

    • 解壓zip文件
    • 將二進制文件(bin/protoc)添加進path環境變量

接着安裝 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 包含如下內容:

  • 生成的客戶端和服務端代碼
  • 生成定義好的 HelloRequestHelloReply 類型操做代碼

運行程序

使用 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 方法,帶有 HelloRequestHelloReply 類型。代碼以下:

//  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代碼

如今使用定義好的服務從新生成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) 代碼, 但讓然須要手動修改部分調用代碼。

修改 server

編輯文件 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
}

修改 client

編輯文件 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

完畢!

相關文章
相關標籤/搜索