package main import ( "context" "fmt" "log" "net/http" "os" "os/signal" "syscall" "time" "streambox/config" "streambox/internal/router" "streambox/pkg/logger" ) func main() { cfg, err := config.Load() if err != nil { log.Fatalf("load config failed: %v", err) } if err := logger.Init(cfg.Log.Level, cfg.Log.Encoding); err != nil { log.Fatalf("init logger failed: %v", err) } defer logger.Sync() r := router.New(cfg) addr := fmt.Sprintf(":%d", cfg.Server.Port) srv := &http.Server{ Addr: addr, Handler: r, } // 可选超时 if d, err := time.ParseDuration(cfg.Server.ReadTimeout); err == nil { srv.ReadTimeout = d } if d, err := time.ParseDuration(cfg.Server.WriteTimeout); err == nil { srv.WriteTimeout = d } go func() { logger.Sugar.Infow("server starting", "addr", addr, "mode", cfg.Server.Mode) if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("listen failed: %v", err) } }() quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit logger.Sugar.Info("shutting down server...") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := srv.Shutdown(ctx); err != nil { logger.Sugar.Errorf("server shutdown failed: %v", err) } logger.Sugar.Info("server exited") }