package app import ( "context" "fmt" "log/slog" "gitea.haiyihy.com/hy/chatapppay/internal/config" "gitea.haiyihy.com/hy/chatapppay/internal/lifecycle" payservice "gitea.haiyihy.com/hy/chatapppay/internal/service/pay" grpcserver "gitea.haiyihy.com/hy/chatapppay/internal/transport/grpc" httpserver "gitea.haiyihy.com/hy/chatapppay/internal/transport/http" "golang.org/x/sync/errgroup" ) // Application 聚合支付服务的 HTTP 与 gRPC 服务。 type Application struct { httpServer *httpserver.Server grpcServer *grpcserver.Server hooks lifecycle.Hooks } // New 构造支付服务应用。 func New(cfg config.Config, logger *slog.Logger) *Application { payHandler := payservice.New() registryHooks := lifecycle.NewRegistryHooks(cfg.Registry, logger.With("component", "registry_hooks")) return &Application{ httpServer: httpserver.New(cfg.App.Name, cfg.App.HTTPAddr, cfg.App.ShutdownTimeout, logger, registryHooks), grpcServer: grpcserver.New(cfg.App.GRPCAddr, cfg.App.ShutdownTimeout, logger, payHandler), hooks: registryHooks, } } // Run 并行启动 HTTP 与 gRPC 服务,收到取消信号后优雅停机。 func (a *Application) Run(ctx context.Context) error { if err := a.hooks.OnRegister(ctx); err != nil { return fmt.Errorf("register lifecycle hook: %w", err) } group, runCtx := errgroup.WithContext(ctx) group.Go(func() error { return a.httpServer.Run(runCtx) }) group.Go(func() error { return a.grpcServer.Run(runCtx) }) return group.Wait() }