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


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

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

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
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形式でセットしてリクエストする。

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

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

1
2
3
4
5
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に置いたので合わせて確認してほしい。