package main import ( "flag" "fmt" "os" "os/signal" "strconv" "syscall" "dubbo.apache.org/dubbo-go/v3/protocol" "dubbo.apache.org/dubbo-go/v3/server" _ "dubbo.apache.org/dubbo-go/v3/imports" "github.com/topfans/backend/pkg/database" "github.com/topfans/backend/pkg/logger" pb "github.com/topfans/backend/pkg/proto/moderation" "github.com/topfans/backend/services/moderationService/client" "github.com/topfans/backend/services/moderationService/config" "github.com/topfans/backend/services/moderationService/provider" "github.com/topfans/backend/services/moderationService/repository" "github.com/topfans/backend/services/moderationService/service" ) var ( port = flag.Int("port", getEnvInt("PORT", 20011), "Dubbo service port") dbHost = flag.String("db-host", getEnv("DB_HOST", "localhost"), "Database host") dbPort = flag.Int("db-port", getEnvInt("DB_PORT", 5432), "Database port") dbUser = flag.String("db-user", getEnv("DB_USER", "postgres"), "Database user") dbPassword = flag.String("db-password", getEnv("DB_PASSWORD", ""), "Database password") dbName = flag.String("db-name", getEnv("DB_NAME", "top-fans"), "Database name") redisHost = flag.String("redis-host", getEnv("REDIS_HOST", "localhost"), "Redis host") redisPort = flag.Int("redis-port", getEnvInt("REDIS_PORT", 6379), "Redis port") redisPassword = flag.String("redis-password", getEnv("REDIS_PASSWORD", ""), "Redis password") redisDB = flag.Int("redis-db", getEnvInt("REDIS_DB", 0), "Redis DB") ) func getEnv(key, fallback string) string { if v := os.Getenv(key); v != "" { return v } return fallback } func getEnvInt(key string, fallback int) int { if v := os.Getenv(key); v != "" { if n, err := strconv.Atoi(v); err == nil { return n } } return fallback } func main() { flag.Parse() // 初始化日志 env := os.Getenv("ENV") if env == "" { env = "development" } if err := logger.Init(logger.Config{ ServiceName: "moderation-service", Environment: env, LogLevel: os.Getenv("LOG_LEVEL"), }); err != nil { panic(fmt.Sprintf("Failed to initialize logger: %v", err)) } defer logger.Sync() logger.Sugar.Info("Starting Moderation Service on port ", *port) // 初始化数据库 if err := initDatabase(); err != nil { logger.Sugar.Fatalf("Failed to initialize database: %v", err) } db := database.GetDB() // 初始化 Redis rdb := client.NewRedisClient(*redisHost, *redisPort, *redisPassword, *redisDB) // 初始化 Repository + TxHelper repo := repository.NewModerationRepository(db) tx := service.NewTxHelper(db) // 初始化 Client assetClient := client.NewAssetClient(db) userClient := client.NewUserClient(db) notifClient, err := client.NewNotificationClient("", nil) if err != nil { logger.Sugar.Fatalf("Failed to create notification client: %v", err) } // 初始化 Config cfg := config.Default // 初始化 Service categorySvc := service.NewCategoryService(repo) autoHideSvc := service.NewAutoHideService(repo, rdb, tx, cfg) reportSvc := service.NewReportService(repo, tx, assetClient, userClient, notifClient, autoHideSvc, categorySvc, cfg) feedbackSvc := service.NewFeedbackService(repo, categorySvc, notifClient, cfg) // 初始化 Provider modProvider := provider.NewModerationProvider(reportSvc, feedbackSvc, categorySvc) // 启动 Dubbo Server srv, err := server.NewServer( server.WithServerProtocol( protocol.WithPort(*port), protocol.WithTriple(), ), ) if err != nil { logger.Sugar.Fatalf("Failed to create Dubbo server: %v", err) } if err := pb.RegisterModerationServiceHandler(srv, modProvider); err != nil { logger.Sugar.Fatalf("Failed to register ModerationService handler: %v", err) } logger.Sugar.Info("Dubbo-go moderation provider registered successfully", "service", "topfans.moderation.ModerationService", "port", *port) // 后台启动 Dubbo go func() { if err := srv.Serve(); err != nil { logger.Sugar.Fatalf("Failed to serve Dubbo: %v", err) } }() // 优雅关闭 quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit logger.Sugar.Info("Shutting down moderation service...") } func initDatabase() error { cfg := database.Config{ Host: *dbHost, Port: *dbPort, User: *dbUser, Password: *dbPassword, DBName: *dbName, SSLMode: "disable", TimeZone: "Asia/Shanghai", } return database.Init(cfg) }