95 lines
2.2 KiB
Go
95 lines
2.2 KiB
Go
/*
|
|
server.go - HTTP服务器核心
|
|
实现了HTTP服务器的基本功能和生命周期管理
|
|
*/
|
|
|
|
package server
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
// Server HTTP服务器结构体
|
|
type Server struct {
|
|
httpServer *http.Server
|
|
router *Router
|
|
addr string
|
|
}
|
|
|
|
// NewServer 创建新的服务器实例
|
|
func NewServer(addr string) *Server {
|
|
router := NewRouter()
|
|
|
|
return &Server{
|
|
httpServer: &http.Server{
|
|
Addr: addr,
|
|
Handler: router,
|
|
ReadTimeout: 15 * time.Second,
|
|
WriteTimeout: 15 * time.Second,
|
|
IdleTimeout: 60 * time.Second,
|
|
},
|
|
router: router,
|
|
addr: addr,
|
|
}
|
|
}
|
|
|
|
// SetupRoutes 设置路由
|
|
func (s *Server) SetupRoutes() {
|
|
// 添加中间件
|
|
s.router.Use(LoggingMiddleware)
|
|
s.router.Use(CORSMiddleware)
|
|
s.router.Use(RecoveryMiddleware)
|
|
|
|
// 静态文件服务
|
|
s.router.HandleFunc("/", HomeHandler).Methods("GET")
|
|
s.router.PathPrefix("/static/").Handler(
|
|
http.StripPrefix("/static/", http.FileServer(http.Dir("./static/"))),
|
|
)
|
|
|
|
// 健康检查
|
|
s.router.HandleFunc("/health", HealthHandler).Methods("GET")
|
|
|
|
// API路由
|
|
apiRouter := s.router.PathPrefix("/api").Subrouter()
|
|
|
|
// 用户管理API
|
|
apiRouter.HandleFunc("/users", GetUsersHandler).Methods("GET")
|
|
apiRouter.HandleFunc("/users", CreateUserHandler).Methods("POST")
|
|
apiRouter.HandleFunc("/users/{id:[0-9]+}", GetUserHandler).Methods("GET")
|
|
apiRouter.HandleFunc("/users/{id:[0-9]+}", UpdateUserHandler).Methods("PUT")
|
|
apiRouter.HandleFunc("/users/{id:[0-9]+}", DeleteUserHandler).Methods("DELETE")
|
|
|
|
// 服务器统计
|
|
apiRouter.HandleFunc("/stats", StatsHandler).Methods("GET")
|
|
|
|
// API文档
|
|
apiRouter.HandleFunc("", APIDocHandler).Methods("GET")
|
|
}
|
|
|
|
// Start 启动服务器
|
|
func (s *Server) Start() error {
|
|
fmt.Printf("✅ 服务器启动成功,监听地址: %s\n", s.addr)
|
|
return s.httpServer.ListenAndServe()
|
|
}
|
|
|
|
// Shutdown 优雅关闭服务器
|
|
func (s *Server) Shutdown() error {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
return s.httpServer.Shutdown(ctx)
|
|
}
|
|
|
|
// GetRouter 获取路由器
|
|
func (s *Server) GetRouter() *Router {
|
|
return s.router
|
|
}
|
|
|
|
// GetHTTPServer 获取HTTP服务器
|
|
func (s *Server) GetHTTPServer() *http.Server {
|
|
return s.httpServer
|
|
}
|