Files
blog-server/cmd/main.go
2026-08-19 22:05:49 +08:00

82 lines
1.5 KiB
Go

package main
import (
"context"
"fmt"
"log/slog"
"net/http"
"os"
"server/internal/config"
"server/internal/db"
"server/internal/handler"
"server/internal/service"
"server/internal/middleware"
"server/internal/pkg/cache"
"server/internal/pkg/logger"
"server/internal/router"
"github.com/go-chi/chi/v5"
"go.uber.org/fx"
)
func NewHttpServer(lc fx.Lifecycle, r *chi.Mux, cfg *config.Config) *http.Server {
srv := &http.Server{
Addr: fmt.Sprintf("%s:%s", cfg.Server.Host, cfg.Server.Port),
Handler: r,
}
lc.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
go func() {
err := srv.ListenAndServe()
if err != nil {
slog.Error("server error", "error", err)
}
}()
slog.Info(fmt.Sprintf("starting HTTP server http://%s", srv.Addr))
return nil
},
OnStop: func(ctx context.Context) error {
return srv.Shutdown(ctx)
},
})
return srv
}
func main() {
app := fx.New(
fx.Provide(
config.NewConfig,
logger.New,
db.NewDB,
db.NewStore,
db.NewRedisClient,
cache.NewCaches,
middleware.NewJWTMiddleware,
middleware.NewAuthMiddleware,
middleware.NewLoggerMiddleware,
middleware.NewAccessLogMiddleware,
middleware.NewRequestContextMiddleware,
router.NewRouter,
),
handler.Module,
service.Module,
fx.Invoke(func(*slog.Logger) {}),
fx.Invoke(NewHttpServer),
)
// 装配失败(如 jwt.secret 未配置)以非零码退出,让部署脚本可感知
if err := app.Err(); err != nil {
slog.Error("application failed", "error", err)
os.Exit(1)
}
app.Run()
}