grpc-ecosystem/grpc-gatewayのセットアップ方法をまとめてみた

Server Side Kotlinのアウトプットにつかっているレポジトリにgrpc-gatewayを入れてみたので、セットアップ方法をまとめておく。

github.com

grpc-gatewayはHTTP/1.1のAPIの提供する。定義したprotoにoptionを加えることでHTTP/1.1 APIのコードとgrpc-clientのリクエストを仲介するgoコードが生成される。

定義したprotoに次のようなoptionを加える。

service TaskService {
    rpc GetTaskService (GetTaskInbound) returns (TaskOutbound) {
        option (google.api.http) = {
            post: "/grpcgateway/task"
            body: "*"
            };
    }
}

message GetTaskInbound {
    uint32 task_id = 1;
}

このoption定義によるとPOSTメソッドで パスが/grpcgateway/taskのエンドポイントができあがる。リクエストボディには次のようにprotoに定義したGetTaskInboundのmessage定義をJSON形式でセットしてリクエストする。

$ curl -XPOST \
           http://localhost:8081/grpcgateway/task \
           -H 'Content-type: application/json' \
           -d '{"task_id": 1}'

次にprotocでHTTP/1.1 APIのコードとgrpc-clientのリクエストを仲介するgoコードを生成する。

protoc -I/usr/local/include \
    -I./proto \
    -I$$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \
    --grpc-gateway_out=logtostderr=true:grpc/gen/ \
    ./proto/soushin/spring5-kotlin-application/task/task.proto

このprotocを実行すると task.pb.gw.goが生成される。生成されたproxyコードを使ってエンドポイントに定義すれば良い。 定義の仕方はgrpc-gatewayのexmapleが分かりやすい。

grpc-gateway/main.go at master · grpc-ecosystem/grpc-gateway · GitHub

コード

動くコードをgithubに置いたので合わせて確認してほしい。

github.com