gRPC golang初歩接触
概要
gRPCはprotocol buffersをIDL(Interface Definition Language)として使用し、プラットフォーム間、言語間のRPC(リモートプロシージャ呼び出し)メカニズムを提供し、本稿では例示的なプログラムを通じてgRPCの基本的な使用について説明する.
ぜんちじょうけん Goバージョン1.6以上(転送) gRPC を取り付ける. Protocol Buffers v 3 Protocolコンパイラのインストールは、gRPCサービスコードを生成するために使用されます.対応するzipファイルパッケージをダウンロードしてインストールすれば転送できます. zipファイル を解凍する path環境変数 にバイナリファイル(bin/protoc)を追加
次にprotocのGoプラグインをインストールします.
protoc-gen-goコンパイラプラグインは$GOBINにインストールされ、変数は$GOPATH/binと定義され、$PATH環境変数にはprotocol,protoc関連コマンドが存在する必要があります.
コードのダウンロード
$GOPATH/src/googleにあるgRPCサンプルライブラリGIthubをダウンロードします.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/helloworld
ファイルpb.goには以下の内容が含まれています.によって生成されたクライアントおよびサービス側コード 定義HelloRequestおよびHelloReplyタイプの操作コード を生成する
プログラムの実行
go runコマンドを使用して実行します.
サービス・エンドの実行:
クライアントを実行するには、次の手順に従います.
Greeting:Hello worldを印刷すると、client-serverベースのgRPC運用が成功したことを示します.
プログラムの変更
目的:サービス側(server)はクライアント呼び出しのための新しい方法(SayHelloAgain)を追加する.gRPCサービスはprotocolを定義する.このアドレスとこのアドレスで定義を見つけることができます.protoファイルの詳細.次に、サービス側とクライアント「stub」には、クライアントHelloRequestタイプパラメータを受け入れ、サービス側からHelloReplyタイプ結果を返すSayHelloメソッドが同時に存在することを知る必要があります.コードは次のとおりです.
GreeterにSayHelloAgainメソッドを追加し、現在の作業ディレクトリが$GOPATH/src/googleであることを確認します.golang.org/grpc/examples/helloworld.
helloworld/helloworld.Protoファイルは、HelloRequestとHelloReplyタイプを持つSayHelloAgainメソッドを追加します.コードは次のとおりです.
gRPCコードの生成
定義されたサービスを使用してgRPCコードを再生成します.作業ディレクトリは($GOPATH/src/google.golang.org/grpc/examples/helloworld)です.コマンドは次のとおりです.
ファイルpb.goが再生成されます.
変更&再実行
サービス側(server)とクライアント(client)コードは再生成されたが、呼び出しコードの一部を手動で変更する必要がある.
サーバの変更
ファイルの編集greeter_server/main.go、次のコードを追加します.
クライアントの変更
ファイルの編集greeter_client/main.go、main関数に次のコードを追加します.
うんてん
サービス・エンドの実行:
クライアントの実行:
期待される結果:
終わりだ!
gRPCはprotocol buffersをIDL(Interface Definition Language)として使用し、プラットフォーム間、言語間のRPC(リモートプロシージャ呼び出し)メカニズムを提供し、本稿では例示的なプログラムを通じてgRPCの基本的な使用について説明する.
ぜんちじょうけん
$ go version
$ go get -u google.golang.org/grpc
次にprotocのGoプラグインをインストールします.
$ go get -u github.com/golang/protobuf/protoc-gen-go
protoc-gen-goコンパイラプラグインは$GOBINにインストールされ、変数は$GOPATH/binと定義され、$PATH環境変数にはprotocol,protoc関連コマンドが存在する必要があります.
$ export PATH=$PATH:$GOPATH/bin
コードのダウンロード
$GOPATH/src/googleにあるgRPCサンプルライブラリGIthubをダウンロードします.golang.org/grpc/examplesディレクトリの下にあります.
$ 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/helloworld
ファイルpb.goには以下の内容が含まれています.
プログラムの実行
go runコマンドを使用して実行します.
サービス・エンドの実行:
$ go run greeter_server/main.go
クライアントを実行するには、次の手順に従います.
$ go run greeter_client/main.go
Greeting:Hello worldを印刷すると、client-serverベースのgRPC運用が成功したことを示します.
プログラムの変更
目的:サービス側(server)はクライアント呼び出しのための新しい方法(SayHelloAgain)を追加する.gRPCサービスはprotocolを定義する.このアドレスとこのアドレスで定義を見つけることができます.protoファイルの詳細.次に、サービス側とクライアント「stub」には、クライアントHelloRequestタイプパラメータを受け入れ、サービス側からHelloReplyタイプ結果を返すSayHelloメソッドが同時に存在することを知る必要があります.コードは次のとおりです.
// 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ファイルは、HelloRequestとHelloReplyタイプを持つSayHelloAgainメソッドを追加します.コードは次のとおりです.
// 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
ファイル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
終わりだ!