まくろぐ
更新: / 作成:

Protoco Buffers の サービス型 は、クライアントとサーバー間の通信方法 (RPC メソッド群) を定義するための型で、.proto ファイルの中で service キーワードを使って定義します。

次の例では、Echo メソッドを持つ EchoService サービス型を定義しています。

// Echo メソッドを持つ EchoService の定義
service EchoService {
  rpc Echo (EchoRequest) returns (EchoResponse);
}

// Echo に送るリクエストメッセージの定義
message EchoRequest {
  string message = 1;
  optional string payload = 2;
}

// Echo が返すレスポンスメッセージの定義
message EchoResponse {
  string message = 1;
}

引数と戻り値の方には、上記のように単一のメッセージ型を指定します。 スカラー型を指定することはできないので、単一の値を渡したいときも、独自のメッセージ型を用意する必要があります。 慣例として、引数の型には Request、戻り値の型には Response というサフィックスを付けます。

引数や戻り値が存在しない場合は、Google が用意している google.protobuf.Empty 型を使用することができます。

import "google/protobuf/empty.proto";

service HelloService {
  rpc Hello(google.protobuf.Empty) returns (google.protobuf.Empty);
}

ただ、将来的に何らかの値を渡す可能性がある場合は、独自の空っぽのメッセージ型を定義しておくのがよいでしょう。

service HelloService {
  rpc Hello(HelloRequest) returns (HelloResponse);
}

message HelloRequest {}
message HelloResponse {}

RPC の通信プロトコルは、独自で実装してしまうことも可能ですが、多くの場合は Google が作った gRPC というプロトコルを使います。 というより、gRPC による通信を実現するために、Protocol Buffers (protobuf) によるシリアライズを使用することになるというケースが多いと思います。 protoc コマンド本体には、gRPC 用のスタブコードを生成する機能は入っていないので、protoc のプラグイン(protoc-gen-go-grpc など)を入れてコード生成することになります。

関連記事

まくろぐ
サイトマップまくへのメッセージ