topfans/backend/pkg/health/health.go

62 lines
1.4 KiB
Go

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)
}