クイックスタート

このガイドでは、シンプルな動作する例でGoのgRPCの始め方を説明します。

クイックスタート

このガイドでは、シンプルな動作する例でGoのgRPCの始め方を説明します。

前提条件

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

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

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

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

  • Protocol Compiler 用のGoプラグイン

    1. 以下のコマンドを使用して、Protocol Compiler 用のGoプラグインをインストールします。

      go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
      go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
      
    2. protoc コンパイラがプラグインを見つけられるように、PATH を更新してください。

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

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

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

  1. リポジトリをzipファイルとしてダウンロード して展開するか、リポジトリをクローンしてください。

    git clone -b v1.74.2 --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サービスは protocol buffers を使用して定義されます。.proto ファイルでサービスを定義する方法の詳細については、Basics tutorial を参照してください。現時点では、サーバーとクライアントスタブの両方に、クライアントからの 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
    

次は何をするか