3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

protocol bufferの定義とコンパイル

さてではgRPCの実装を始めていきます。
今日はインターフェイスの定義とprotocol bufferのコンパイルまで行いたいと思います。

protocol buffer

まずはじめにすることはprotocol bufferでAPIのインターフェイスを定義することです。
今回はありきたりではありますがTodoサービスインターフェイスを定義したいと思います。

proto/service.protoというファイルを作成し、以下のように記述します。

syntax = "proto3";

package service;

service TodoAPI {
    rpc GetTodo(GetTodoRequest) returns (GetTodoResponse) {}
    rpc CreateTodo(CreateTodoRequest) returns (CreateTodoResponse) {}
    rpc ListTodos(ListTodosRequest) returns (ListTodosResponse) {}
}

message GetTodoRequest {
    string id = 1;
}

message GetTodoResponse {
    Todo todo = 1;
}

message CreateTodoRequest {
    Todo todo = 1;
}

message CreateTodoResponse {
    bool success = 1;
    string id = 2;
}

message ListTodosRequest {}

message ListTodosResponse {
    repeated Todo todos = 1;
}

message Todo {
    string title = 1;
    string description = 2;
}

protoファイルの管理に関してですが、会社として明確に決められたものはありません。が、習慣として他のチームが使いうるものはproto専用のレポジトリに切り出して管理、チーム内部でのみ使われるインターフェイスの場合はそのサービスのレポジトリに置いてしまう場合が多いです。
また、配布の仕方としては生成されたファイルではなくprotoファイルのまま各自コンパイルしてもらう方法が推奨されています。理由としては利用側がどの言語を使用するかわからないこと、コンパイルのツールチェインがチームによって異なりうることがあります。

コンパイル

ではコンパイルしてみましょう。
コンパイラとして gogo/protobuf を使います。インストール等はレポジトリを参考にしてください。

生成するGoファイルはinternal/pb/serviceパッケージ内に置くことにします。

$ protoc \
    -I ./proto \
    -I $GOPATH/src:$GOPATH/src/github.com/gogo/protobuf/protobuf \
    --gogoslick_out=plugins=grpc:./internal/pb/service/ \
    service.proto

無事service.pb.goファイルが生成されたでしょうか。

makeタスク

最後にこのコンパイルタスクをMakefileに残しておきましょう。

PROTO_DIR := ./proto
GENERATED_DIR := ./internal/pb
GENERATED_SERVICE_DIR := $(GENERATED_DIR)/service

.PHONY: protos
protos:
    mkdir -pv $(GENERATED_DIR) $(GENERATED_SERVICE_DIR)
    protoc \
        -I $(PROTO_DIR) \
        -I $(GOPATH)/src:$(GOPATH)/src/github.com/gogo/protobuf/protobuf \
        --gogoslick_out=plugins=grpc:$(GENERATED_SERVICE_DIR) \
        service.proto

これでAPIを変更してもmake protosで簡単にコンパイルし直すことができます。


社内にはAPIドキュメントというものはほとんど存在しません。
詳細にコメントされたprotoファイルさえあればAPIの役割はほぼ理解することができます。
gRPCの強力さはこういうところに現れるな、と感じるところです。

明日は生成されたファイルを元にgRPCサーバープロセスを立ち上げたいと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?