クイックスタート

このガイドでは、簡単な動作例を使用して、GoでのgRPCを始められます。

クイックスタート

このガイドでは、簡単な動作例を使用して、GoでのgRPCを始められます。

前提条件

  • Go最新のメジャーリリースのいずれか3つGoのリリース

    インストール手順については、Goのはじめにガイドを参照してください。

  • Protocol bufferコンパイラprotocバージョン3

    インストール手順については、Protocol Buffer Compilerのインストールを参照してください。

  • プロトコルコンパイラのGoプラグイン

    1. 次のコマンドを使用して、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
      
    2. protocコンパイラがプラグインを見つけられるように、PATHを更新します

      $ export PATH="$PATH:$(go env GOPATH)/bin"
      

サンプルコードを取得する

サンプルコードは、grpc-goリポジトリの一部です。

  1. リポジトリをzipファイルとしてダウンロードして解凍するか、リポジトリをクローンします

    $ git clone -b v1.63.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サービスはプロトコルバッファーを使用して定義されます。.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ディレクトリから次のコマンドを実行します

  1. サーバーを実行します

    $ go run greeter_server/main.go
    
  2. 別のターミナルから、クライアントを実行します。今回は、コマンドライン引数として名前を追加します

    $ go run greeter_client/main.go --name=Alice
    

    次の出力が表示されます

    Greeting: Hello Alice
    Greeting: Hello again Alice
    

次のステップ