github.com/renbou/grpcbridge@v0.0.2-0.20240416012907-bcbd8b12648a/cmd/grpcbridge/main.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"log/slog"
     7  	"net"
     8  	"net/http"
     9  	"os"
    10  	"os/signal"
    11  	"syscall"
    12  	"time"
    13  
    14  	"github.com/renbou/grpcbridge"
    15  	"github.com/renbou/grpcbridge/bridgelog"
    16  	"github.com/renbou/grpcbridge/internal/config"
    17  	"google.golang.org/grpc"
    18  	"google.golang.org/grpc/credentials/insecure"
    19  )
    20  
    21  func main() {
    22  	if err := mainImpl(); err != nil {
    23  		os.Exit(1)
    24  	}
    25  }
    26  
    27  func mainImpl() error {
    28  	logger := bridgelog.WrapPlainLogger(slog.New(slog.NewJSONHandler(
    29  		os.Stdout,
    30  		&slog.HandlerOptions{Level: config.LogLevel()},
    31  	)))
    32  
    33  	cfg, err := config.Load(logger, os.Args[1:])
    34  	if errors.As(err, new(config.FlagError)) {
    35  		return nil
    36  	} else if err != nil {
    37  		logger.Error("Failed to load configuration", "error", err)
    38  		return err
    39  	}
    40  
    41  	router := grpcbridge.NewReflectionRouter(
    42  		grpcbridge.WithLogger(logger),
    43  		grpcbridge.WithDialOpts(grpc.WithTransportCredentials(insecure.NewCredentials())),
    44  		grpcbridge.WithReflectionPollInterval(time.Second*5),
    45  	)
    46  
    47  	for _, cfg := range cfg.Services {
    48  		if _, err := router.Add(cfg.Name, cfg.Target); err != nil {
    49  			logger.Error("Failed to add service", "service", cfg.Name, "error", err)
    50  			return err
    51  		}
    52  	}
    53  
    54  	lis, err := net.Listen("tcp", ":11111")
    55  	if err != nil {
    56  		logger.Error("Failed to listen", "error", err)
    57  		return err
    58  	}
    59  
    60  	proxy := grpcbridge.NewGRPCProxy(router, grpcbridge.WithLogger(logger))
    61  	grpcServer := grpc.NewServer(proxy.AsServerOption())
    62  
    63  	go func() {
    64  		_ = grpcServer.Serve(lis)
    65  	}()
    66  
    67  	bridge := grpcbridge.NewWebBridge(router, grpcbridge.WithLogger(logger))
    68  
    69  	httpServer := &http.Server{
    70  		Addr:    ":22222",
    71  		Handler: bridge,
    72  	}
    73  
    74  	go func() {
    75  		_ = httpServer.ListenAndServe()
    76  	}()
    77  
    78  	shutdownCh := make(chan os.Signal, 1)
    79  	signal.Notify(shutdownCh, os.Interrupt, syscall.SIGTERM)
    80  	<-shutdownCh
    81  
    82  	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    83  	defer cancel()
    84  
    85  	grpcServer.Stop()
    86  	httpServer.Shutdown(ctx)
    87  
    88  	return nil
    89  }