package server import ( "context" "log/slog" "net/http" "os" "os/signal" "proxy-server/pkg/utils" "proxy-server/server/fwd" "proxy-server/server/pkg/env" "proxy-server/server/pkg/log" "proxy-server/server/pkg/orm" "sync" "syscall" "time" "github.com/joho/godotenv" ) import _ "net/http/pprof" type Context struct { context.Context log *slog.Logger } func Start() { // 初始化 err := godotenv.Load() if err != nil { println("没有本地环境变量文件") } log.Init() env.Init() orm.Init() // 性能监控 go func() { err := http.ListenAndServe(":6060", nil) if err != nil { slog.Error("性能监控服务发生错误", "err", err) } }() // 退出信号 osQuit := make(chan os.Signal) signal.Notify(osQuit, os.Interrupt, syscall.SIGTERM) // 启动服务 slog.Info("启动服务") ctx, cancel := context.WithCancel(context.Background()) defer cancel() wg := sync.WaitGroup{} wg.Add(1) errQuit := make(chan struct{}, 1) defer close(errQuit) go func() { defer wg.Done() err := startFwdServer(ctx) if err != nil { slog.Error("代理服务发生错误", "err", err) } errQuit <- struct{}{} }() // 等待退出信号 select { case <-osQuit: slog.Info("服务主动退出") case <-errQuit: slog.Warn("服务异常退出") } // 退出服务 cancel() timeout, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() wg.Wait() select { case <-utils.ChanWgWait(timeout, &wg): slog.Info("服务已退出") case <-timeout.Done(): slog.Warn("退出超时,强制退出") } } func startFwdServer(ctx context.Context) error { server := fwd.New(nil) go func() { <-ctx.Done() server.Close() }() server.Run() return nil } func startWebServer(ctx context.Context) { }