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 }