この記事は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を使ってクライアントサーバーアプリケーションを実行することができました
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
- gRPCがどのように機能するかの詳細な説明はWhat is gRPC?とgRPC Conceptsを読んでください。
- gRPC Basics:Goでより詳細なチュートリアルを進めてください。
-
リファレンスドキュメントでgRPC Go core
APIを調べてください。