gRPC golang初歩接触

4035 ワード

概要
gRPCはprotocol buffersをIDL(Interface Definition Language)として使用し、プラットフォーム間、言語間のRPC(リモートプロシージャ呼び出し)メカニズムを提供し、本稿では例示的なプログラムを通じてgRPCの基本的な使用について説明する.
ぜんちじょうけん
  • Goバージョン1.6以上(転送)
    $ go version
  • gRPC
    $ go get -u google.golang.org/grpc
  • を取り付ける.
  • Protocol Buffers v 3 Protocolコンパイラのインストールは、gRPCサービスコードを生成するために使用されます.対応するzipファイルパッケージをダウンロードしてインストールすれば転送できます.
  • zipファイル
  • を解凍する
  • path環境変数
  • にバイナリファイル(bin/protoc)を追加

    次に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には以下の内容が含まれています.
  • によって生成されたクライアントおよびサービス側コード
  • 定義HelloRequestおよびHelloReplyタイプの操作コード
  • を生成する
    プログラムの実行
    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

    終わりだ!