148 lines
4.4 KiB
Go
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)
|
|
}
|