package server import ( "context" "github.com/joho/godotenv" "github.com/lmittmann/tint" "github.com/mattn/go-colorable" "log/slog" "os" "proxy-server/server/orm" "proxy-server/server/web" ) func Start() { defer func() { err := recover() if err != nil { slog.Error("服务由于意外的 panic 导致退出", err) } }() ctx := context.Background() // 初始化环境变量 err := godotenv.Load() if err != nil { slog.Debug("没有本地环境变量文件") } // 配置日志 writer := colorable.NewColorable(os.Stdout) logger := slog.New(tint.NewHandler(writer, &tint.Options{ Level: slog.LevelDebug, ReplaceAttr: func(_ []string, attr slog.Attr) slog.Attr { err, ok := attr.Value.Any().(error) if !ok { return attr } return tint.Err(err) }, })) slog.SetDefault(logger) // 初始化公共组件 orm.Init() // 启动子服务 goCount := 1 errChan := make(chan error, goCount) ctxC, cancel := context.WithCancel(ctx) defer cancel() go web.Start(ctxC, errChan) //go monitor.Start(ctxC, errChan) slog.Info("服务启动成功") // 监听异常 well := true for i := 0; i < goCount; i++ { err := <-errChan if err != nil { slog.Error("服务异常退出", err) if well { // 第一次出错时取消其他服务 well = false cancel() } } } close(errChan) slog.Info("服务已全部退出") }