GoでgRPCで構築する方法
gRPCの公式ページのクイックスタートを紹介するものになります。
前提条件
以下のツールがインストールされていることを確認してください:
-
Go: 最新の3つのメジャーリリースのいずれか。インストール手順はGoのGetting Startedガイドを参照してください。
-
Protocol buffer compiler (protoc): バージョン3。インストール手順はProtocol Buffer Compiler Installationを参照してください。
-
Go plugins for the protocol compiler:
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
PATHを更新して、protocコンパイラがプラグインを見つけられるようにします
export PATH="$PATH:$(go env GOPATH)/bin"
サンプルコードの取得
サンプルコードはgrpc-goリポジトリの一部です。
1.リポジトリをクローンします
git clone -b v1.65.0 --depth 1 https://github.com/grpc/grpc-go
2. クイックスタートのサンプルディレクトリに移動します
cd grpc-go/examples/helloworld
サンプルの実行
examples/helloworldディレクトリから以下の手順でサンプルを実行します:
1.サーバーコードをコンパイルして実行します
go run greeter_server/main.go
2.別のターミナルからクライアントコードをコンパイルして実行し、クライアントの出力を確認します
go run greeter_client/main.go
出力例
Greeting: Hello world
これでgRPCを使用したクライアントサーバーアプリケーションが実行されました。
gRPCサービスの更新
次に、サーバーメソッドを追加してアプリケーションを更新します。gRPCサービスはプロトコルバッファを使用して定義されます。
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ファイルが再生成されます。
アプリケーションの更新と実行
新しいメソッドを実装し、クライアントコードで呼び出す必要があります。
サーバーの更新
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())
ファイルを保存します。
実行
再度、サーバーとクライアントを実行します:
1.サーバーを実行
$ go run greeter_server/main.go
2. 別のターミナルからクライアントを実行。今回は名前をコマンドライン引数として追加します
$ go run greeter_client/main.go --name=Alice
出力例
Greeting: Hello Alice
Greeting: Hello again Alice
まとめ
これでgRPCの構築が完了しました。
参考記事