92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"feedsystem_video_go/internal/config"
|
|
"feedsystem_video_go/internal/db"
|
|
apphttp "feedsystem_video_go/internal/http"
|
|
rabbitmq "feedsystem_video_go/internal/middleware/rabbitmq"
|
|
rediscache "feedsystem_video_go/internal/middleware/redis"
|
|
"feedsystem_video_go/internal/observability"
|
|
"log"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
func main() {
|
|
// 加载配置
|
|
log.Printf("Loading config from configs/config.yaml")
|
|
const configPath = "configs/config.yaml"
|
|
cfg, usedDefault, err := config.LoadLocalDev(configPath)
|
|
if err != nil {
|
|
log.Fatalf("Failed to load config: %v", err)
|
|
}
|
|
if usedDefault {
|
|
log.Printf("Config File %s not found, using default local config", configPath)
|
|
} else {
|
|
log.Printf("Config loaded from file: %s", configPath)
|
|
}
|
|
|
|
// 连接数据库
|
|
//log.Printf("Database config: %v", cfg.Database)
|
|
sqlDB, err := db.NewDB(cfg.Database)
|
|
if err != nil {
|
|
log.Fatalf("Failed to connect database: %v", err)
|
|
}
|
|
if err := db.AutoMigrate(sqlDB); err != nil {
|
|
log.Fatalf("Failed to auto migrate database: %v", err)
|
|
}
|
|
defer db.CloseDB(sqlDB)
|
|
|
|
// 连接 Redis (可选,用于缓存)
|
|
cache, err := rediscache.NewFromEnv(&cfg.Redis)
|
|
if err != nil {
|
|
log.Printf("Redis config error (cache disabled): %v", err)
|
|
cache = nil
|
|
} else {
|
|
pingCtx, cancel := context.WithTimeout(context.Background(), 300*time.Millisecond)
|
|
defer cancel()
|
|
if err := cache.Ping(pingCtx); err != nil {
|
|
log.Printf("Redis not available (cache disabled): %v", err)
|
|
_ = cache.Close()
|
|
cache = nil
|
|
} else {
|
|
defer cache.Close()
|
|
log.Printf("Redis connected (cache enabled)")
|
|
}
|
|
}
|
|
|
|
// 连接 RabbitMQ (可选,用于消息队列)
|
|
rmq, err := rabbitmq.NewRabbitMQ(&cfg.RabbitMQ)
|
|
if err != nil {
|
|
log.Printf("RabbitMQ config error (disabled): %v", err)
|
|
rmq = nil
|
|
} else {
|
|
defer rmq.Close()
|
|
log.Printf("RabbitMQ connected")
|
|
}
|
|
// Pprof
|
|
pprofServer, err := observability.StartPprofServer(
|
|
"API",
|
|
cfg.ObservabilityConfig.Pprof.Enabled,
|
|
cfg.ObservabilityConfig.Pprof.ApiAddr,
|
|
)
|
|
if err != nil {
|
|
log.Printf("Failed to start API pprof server: %v", err)
|
|
}
|
|
defer func() {
|
|
shutdownCtx, cancel := context.WithTimeout(context.Background(), 3 * time.Second)
|
|
defer cancel()
|
|
if err := observability.Shutdown(shutdownCtx, pprofServer); err != nil {
|
|
log.Printf("Failed to shutdown API pprof server: %v", err)
|
|
}
|
|
}()
|
|
|
|
// 设置路由
|
|
r := apphttp.SetRouter(sqlDB, cache, rmq)
|
|
log.Printf("Server is running on port %d", cfg.Server.Port)
|
|
if err := r.Run(":" + strconv.Itoa(cfg.Server.Port)); err != nil {
|
|
log.Fatalf("Failed to run server: %v", err)
|
|
}
|
|
}
|