6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

gRPC - Go Quick Startの和訳

Last updated at Posted at 2019-02-12

この記事は2019/02/12時点のGo Quick Startを和訳したものです。


このガイドでは、GoでgRPCを使い始めるための簡単な例を紹介します。

はじめる前に

前提条件

Goのバージョン

gRPCはGo 1.6以上が必要です。(こちらによると1.9以上)

$ go version

Go自体のインストール手順については、このガイドに従ってください。: Getting Started - The Go Programming Language

gRPCのインストール
gRPCをインストールするには、次のコマンドを使用します。

$ go get -u google.golang.org/grpc

Protocol Buffers v3のインストール
gRPCサービスコードを生成するために使用されるprotocコンパイラをインストールしてください。これを行う最も簡単な方法は、ここからあなたのプラットフォーム用のコンパイル済みバイナリ(protoc-<version>-<platform>.zip)をダウンロードすることです: https://github.com/google/protobuf/releases

  • ダウンロードしたファイルを解凍してください
  • protocバイナリファイルへのパスを含めるように環境変数PATHを更新します。

個人的な補足
protocのインストールはMacならHomebrewでも可能です。この時点でprotoc --versionで正しくprotocがインストールされたか確認しておくと良い。


次に、Go用のprotocプラグインをインストールします

$ go get -u github.com/golang/protobuf/protoc-gen-go

コンパイラプラグインprotoc-gen-go$GOBINにインストールされ、デフォルトで$GOPATH/binになります。プロトコルコンパイラ(protoc)がプラグインを見つけるには、$GOPATH/bin$PATHに入っている必要があります。

$ export PATH=$PATH:$GOPATH/bin

サンプルのダウンロード

go get google.golang.org/grpcで取得されたgrpcコードにも例が含まれています。それらはexamplesディレクトリの下にあります:$GOPATH/src/google.golang.org/grpc/examples

サンプルのビルド

サンプルディレクトリに移動します。

$ cd $GOPATH/src/google.golang.org/grpc/examples/helloworld

gRPCサービスは、対応する.pb.goファイルを生成するために使用される.protoファイルで定義されています。 .pb.goファイルは、プロトコルコンパイラ(protoc)を使用して.protoファイルをコンパイルすることによって生成されます。

.protoファイル -> protocでコンパイル -> .pb.goファイル

この例の目的のために、helloworld.pb.goファイルは(helloworld.protoをコンパイルすることによって)すでに生成されており、次のディレクトリにあります。$GOPATH/src/google.golang.org/grpc/examples/helloworld/helloworld

このhelloworld.pb.goファイルが次のものを含みます。

  • 生成されたクライアントとサーバーのコード
  • HelloRequestおよびHelloReplyメッセージタイプを生成、直列化、および取得するためのコード

試してみよう!

サーバーとクライアントのコードをコンパイルして実行するには、go runコマンドを使用できます。
examplesディレクトリ内で以下を実行時して、

$ go run greeter_server/main.go

別の端末から以下を実行します。

$ go run greeter_client/main.go

If things go smoothly, you will see the Greeting: Hello world in the client side output.

上手くいけばクライアント側の出力でGreeting: Hello worldが見られます。

おめでとうございます。 gRPCを使ってクライアントサーバーアプリケーションを実行することができました :tada:

gRPCサービスの更新

それでは、クライアントが呼び出すためのサーバー上の追加メソッドを持つアプリケーションを更新する方法を見てみましょう。 当社のgRPCサービスはプロトコルバッファを使用して定義されています。 What is gRPC?gRPC Basics - Goで.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;
}

Greeterサービスに2つのメソッドがあるようにこれを更新しましょう。上記と同じ例のディレクトリ($GOPATH/src/google.golang.org/grpc/examples/helloworld)にいることを確認してください。

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コードの生成

次に、新しいサービス定義を使用するために、アプリケーションで使用されているgRPCコードを更新する必要があります。上記と同じ例のディレクトリから($GOPATH/src/google.golang.org/grpc/examples/helloworld


$ protoc -I helloworld/ helloworld/helloworld.proto --go_out=plugins=grpc:helloworld 

これにより、新しい変更でhelloworld.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.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_client/main.go

更新された出力が表示されるはずです。

$ go run greeter_client/main.go
Greeting: Hello world
Greeting: Hello again world

What’s next

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?