package server import ( "context" "fmt" "log" "net/http" "os" "os/signal" "smart-customer-service/config" "smart-customer-service/internal/router" "syscall" "time" ) type Server struct { cfg *config.Config router *router.Router server *http.Server } func New(cfg *config.Config) *Server { r := router.New(cfg) return &Server{ cfg: cfg, router: r, server: &http.Server{ Addr: fmt.Sprintf(":%d", cfg.Server.Port), Handler: r.SetupRoutes(), ReadTimeout: time.Duration(cfg.Server.ReadTimeout) * time.Second, WriteTimeout: time.Duration(cfg.Server.WriteTimeout) * time.Second, }, } } func (s *Server) Run() error { // 启动HTTP服务器 go func() { log.Printf("Server starting on port %d", s.cfg.Server.Port) if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalf("Failed to start server: %v", err) } }() // 启动WebSocket服务器 go func() { log.Printf("WebSocket server starting on port %d", s.cfg.WebSocket.Port) // TODO: 启动WebSocket服务器 }() // 等待中断信号 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down server...") // 优雅关闭 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := s.server.Shutdown(ctx); err != nil { return fmt.Errorf("server forced to shutdown: %v", err) } log.Println("Server exited properly") return nil }