1つのgrpc-gatewayに複数のAPI(gRPC)サーバーを繋ぐ

1つのgrpc-gatewayに複数サービス繋いで、認証は共通化するみたいなの作りたかったので調べてみました。

実装方法は簡単で、RegisterXXXXHandlerFromEndpoint に渡すendpointを変えればいいだけでした。  

package main

import (
    "flag"
    "net/http"

    "github.com/golang/glog"
    "github.com/grpc-ecosystem/grpc-gateway/runtime"
    "golang.org/x/net/context"
    "google.golang.org/grpc"

    gw_user "protocol/user"
    gw_cart"protocol/cart"
)

var (
    userEndpoint = flag.String("user_endpoint", "localhost:50051", "endpoint of YourService")
    cartEndpoint = flag.String("cart_endpoint", "localhost:50052", "endpoint of YourService")
)

func run() error {
    ctx := context.Background()
    ctx, cancel := context.WithCancel(ctx)
    defer cancel()

    mux := runtime.NewServeMux()
    opts := []grpc.DialOption{grpc.WithInsecure()}

    // localhost:50051と通信する
    if err := gw_user.RegisterUserHandlerFromEndpoint(ctx, mux, *userEndpoint, opts); err != nil {
        return err
    }

    // localhost:50052と通信する
    if err := gw_cart.RegisterCartHandlerFromEndpoint(ctx, mux, *cartEndpoint, opts); err != nil {
        return err
    }

    return http.ListenAndServe(":8080", mux)
}

func main() {
    flag.Parse()
    defer glog.Flush()

    if err := run(); err != nil {
        glog.Fatal(err)
    }
}