package web import ( "context" "fmt" "log/slog" _ "net/http/pprof" "platform/web/events" deps "platform/web/globals" "platform/web/tasks" "time" "github.com/gofiber/fiber/v2" "github.com/hibiken/asynq" "golang.org/x/sync/errgroup" ) func RunApp(pCtx context.Context) error { g, ctx := errgroup.WithContext(pCtx) // 初始化依赖 err := deps.Init(ctx) if err != nil { return fmt.Errorf("初始化依赖失败: %w", err) } defer func() { err := deps.Close() if err != nil { slog.Error("关闭依赖失败", "error", err) } }() // 运行服务 g.Go(func() error { return RunWeb(ctx) }) g.Go(func() error { return RunTask(ctx) }) return g.Wait() } func RunWeb(ctx context.Context) error { fiber := fiber.New(fiber.Config{ ProxyHeader: fiber.HeaderXForwardedFor, ErrorHandler: ErrorHandler, }) ApplyMiddlewares(fiber) ApplyRouters(fiber) // 停止服务 go func() { <-ctx.Done() err := fiber.Shutdown() if err != nil { slog.Error("服务停止失败", "error", err) } }() // 启动服务 slog.Info("web 服务开始监听 :8080") err := fiber.Listen("0.0.0.0:8080") if err != nil { return fmt.Errorf("web 服务监听失败: %w", err) } slog.Info("web 服务已停止") return nil } func RunTask(ctx context.Context) error { var server = asynq.NewServerFromRedisClient(deps.Redis, asynq.Config{ ShutdownTimeout: 5 * time.Second, ErrorHandler: asynq.ErrorHandlerFunc(func(ctx context.Context, task *asynq.Task, err error) { slog.Error("任务执行失败", "task", task.Type(), "error", err) }), }) var mux = asynq.NewServeMux() mux.HandleFunc(events.RemoveChannel, tasks.HandleRemoveChannel) mux.HandleFunc(events.CompleteTrade, tasks.HandleCompleteTrade) // 停止服务 go func() { <-ctx.Done() server.Shutdown() }() // 启动服务 err := server.Run(mux) if err != nil { return fmt.Errorf("任务服务运行失败: %w", err) } return nil }