echo製のサーバでgRPCも走らせる方法


echoで作ってるRESTサーバにgRPCを足したかったのだけど、さっとやり方が見つからなかったのでメモ

こんな感じのechoのミドルウェアを作って

func GRPCMiddleware(grpcServer *grpc.Server) func(next echo.HandlerFunc) echo.HandlerFunc {
    return func(next echo.HandlerFunc) echo.HandlerFunc {
        return func(c echo.Context) error {
            r := c.Request()
            w := c.Response()
            if r.ProtoMajor == 2 && strings.Contains(r.Header.Get("Content-Type"), "application/grpc") {
                grpcServer.ServeHTTP(w, r)
                return nil
            }
            if err := next(c); err != nil {
                c.Error(err)
            }
            return nil
        }
    }
}

使う

e.Use(GRPCMiddleware(gRPCServer))

認証とかロギング エラーハンドリングを一元管理できていいです。
そのうちjsからgRPC叩けるようなればgRPCだけでいいんでしょうけど、、

ネタ元
https://github.com/philips/grpc-gateway-example/blob/master/cmd/serve.go#L51