Useful gRPC utilities

Because gRPC is a pain.

Gateway

Abstracts all of the set-up needed for grpc-gateway, including extracting the required auth headers, etc.

Service

Service is a useful wrapper for creating gRPC services, with grpc-gateway wrappers. It exposes a set of methods for registering a gRPC service, a grpc-gateway endpoint, and regular web endpoints, too.

Example

logger, _ := zap.NewProduction()
conf := config.Load()
dbConn := db.New(conf)
s := service.New(
    ":9000",
    ":8080",
    logger,
)

// Register a swagger JSON file for docs as a public web endpoint
_ = s.RegisterGatewayEndpoint(func(mux *runtime.ServeMux) error {
    return mux.HandlePath(http.MethodGet, "/docs/analytics/swagger.json", func(w http.ResponseWriter, r *http.Request, _ map[string]string) {
        gateway.ServeSwaggerFile(w, r)
    })
})

// Register the grpc-gateway endpoint
_ = s.RegisterGateway(func(ctx context.Context, mux *runtime.ServeMux, addr string, opts []grpc.DialOption) error {
    return pb.RegisterAnalyticsServiceHandlerFromEndpoint(ctx, mux, conf.Addr, opts)
})

// Register the gRPC service itself
s.RegisterService(func(server *grpc.Server) {
    pb.RegisterAnalyticsServiceServer(server, grpcTransport.New(logger, conf))
})

// Register the health check endpoint
s.RegisterHealthServer(grpcTransport.NewHealthChecker(logger, dbConn))

// Start service
if err := s.Start(); err != nil {
    logger.Panic(err.Error())
}

Last updated