package server import ( "context" "fmt" "time" fiberzap "github.com/gofiber/contrib/fiberzap/v2" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) type Server struct { port int logger *zap.Logger } func NewServer(port int, logger *zap.Logger) *Server { return &Server{ port: port, logger: logger, } } func (s *Server) Run(ctx context.Context) { sugared := s.logger.Sugar() config := fiber.Config{ DisableStartupMessage: true, IdleTimeout: 10 * time.Second, ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, } app := fiber.New(config) app.Use(fiberzap.New(fiberzap.Config{ Logger: s.logger, })) app.Get("/", func(c *fiber.Ctx) error { return c.SendString("Hello, World!") }) go func() { err := app.Listen(fmt.Sprintf(":%d", s.port)) if err != nil { panic(err) } }() sugared.Infow("HTTP server is now running", "port", s.port) <-ctx.Done() shutdownBegan := time.Now() sugared.Infoln("Shutting HTTP server down gracefully...") err := app.ShutdownWithTimeout(10 * time.Second) if err != nil { panic(err) } // Cleanup code here sugared.Infow("HTTP server shut down gracefully.", "took", time.Since(shutdownBegan)) }