クイックスタート
このガイドでは、簡単な動作例を使用して、GoでのgRPCを始められます。
クイックスタート
前提条件
インストール手順については、Goのはじめにガイドを参照してください。
Protocol bufferコンパイラ、
protoc
、バージョン3。インストール手順については、Protocol Buffer Compilerのインストールを参照してください。
プロトコルコンパイラのGoプラグイン
次のコマンドを使用して、Go用のプロトコルコンパイラプラグインをインストールします
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 $ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2
protoc
コンパイラがプラグインを見つけられるように、PATH
を更新します$ export PATH="$PATH:$(go env GOPATH)/bin"
サンプルコードを取得する
サンプルコードは、grpc-goリポジトリの一部です。
リポジトリをzipファイルとしてダウンロードして解凍するか、リポジトリをクローンします
$ git clone -b v1.63.0 --depth 1 https://github.com/grpc/grpc-go
クイックスタートのサンプルディレクトリに移動します
$ cd grpc-go/examples/helloworld
サンプルを実行する
examples/helloworld
ディレクトリから
サーバーコードをコンパイルして実行します
$ go run greeter_server/main.go
別のターミナルから、クライアントコードをコンパイルして実行し、クライアントの出力を確認します
$ go run greeter_client/main.go Greeting: Hello world
おめでとうございます!gRPCを使用してクライアントサーバーアプリケーションを実行しました。
gRPCサービスを更新する
このセクションでは、サーバーメソッドを追加してアプリケーションを更新します。gRPCサービスはプロトコルバッファーを使用して定義されます。.proto
ファイルでサービスを定義する方法の詳細については、基本チュートリアルを参照してください。今のところ、知っておく必要があるのは、サーバーとクライアントスタブの両方に、クライアントからHelloRequest
パラメーターを受け取り、サーバーからHelloReply
を返すSayHello()
RPCメソッドがあること、そしてメソッドが次のように定義されているということです
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
helloworld/helloworld.proto
を開き、同じリクエストとレスポンスタイプを持つ新しいSayHelloAgain()
メソッドを追加します
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
// Sends another greeting
rpc SayHelloAgain (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
ファイルを保存することを忘れないでください!
gRPCコードを再生成する
新しいサービスメソッドを使用する前に、更新された.proto
ファイルを再コンパイルする必要があります。
examples/helloworld
ディレクトリにいる間に、次のコマンドを実行します
$ protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
helloworld/helloworld.proto
これにより、次の内容を含むhelloworld/helloworld.pb.go
ファイルとhelloworld/helloworld_grpc.pb.go
ファイルが再生成されます。
HelloRequest
メッセージタイプとHelloReply
メッセージタイプを設定、シリアル化、および取得するためのコード。- 生成されたクライアントコードとサーバーコード。
アプリケーションを更新して実行する
サーバーコードとクライアントコードを再生成しましたが、サンプルアプリケーションの人間が記述した部分に新しいメソッドを実装して呼び出す必要があります。
サーバーを更新する
greeter_server/main.go
を開き、次の関数を追加します
func (s *server) SayHelloAgain(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
return &pb.HelloReply{Message: "Hello again " + in.GetName()}, 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.GetMessage())
変更を保存することを忘れないでください。
実行!
以前と同じようにクライアントとサーバーを実行します。examples/helloworld
ディレクトリから次のコマンドを実行します
サーバーを実行します
$ go run greeter_server/main.go
別のターミナルから、クライアントを実行します。今回は、コマンドライン引数として名前を追加します
$ go run greeter_client/main.go --name=Alice
次の出力が表示されます
Greeting: Hello Alice Greeting: Hello again Alice