topfans/backend/services/moderationService/main.go
2026-06-22 17:19:48 +08:00

148 lines
4.4 KiB
Go

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)
}