package health import ( "fmt" "log" "net/http" "sync" ) // Handler 健康检查处理器 type Handler struct { serviceName string port int server *http.Server wg sync.WaitGroup } // NewHandler 创建健康检查处理器 func NewHandler(serviceName string, port int) *Handler { return &Handler{ serviceName: serviceName, port: port, } } // Start 启动健康检查 HTTP 服务器 func (h *Handler) Start() { mux := http.NewServeMux() mux.HandleFunc("/health", h.handleHealth) h.server = &http.Server{ Addr: fmt.Sprintf(":%d", h.port), Handler: mux, } h.wg.Add(1) go func() { defer h.wg.Done() log.Printf("[%s] Health check server started on port %d", h.serviceName, h.port) if err := h.server.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Printf("[%s] Health check server error: %v", h.serviceName, err) } }() } // Stop 停止健康检查 HTTP 服务器 func (h *Handler) Stop() { if h.server != nil { if err := h.server.Close(); err != nil { log.Printf("[%s] Health check server close error: %v", h.serviceName, err) } } h.wg.Wait() log.Printf("[%s] Health check server stopped", h.serviceName) } func (h *Handler) handleHealth(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) w.Header().Set("Content-Type", "application/json") fmt.Fprintf(w, `{"status":"ok","service":"%s"}`, h.serviceName) }