133 lines
4.4 KiB
Go
133 lines
4.4 KiB
Go
package main
|
||
|
||
import (
|
||
"flag"
|
||
"fmt"
|
||
"os"
|
||
"os/signal"
|
||
"syscall"
|
||
|
||
dubboclient "dubbo.apache.org/dubbo-go/v3/client"
|
||
_ "dubbo.apache.org/dubbo-go/v3/imports"
|
||
"dubbo.apache.org/dubbo-go/v3/protocol"
|
||
"dubbo.apache.org/dubbo-go/v3/server"
|
||
|
||
"github.com/topfans/backend/pkg/database"
|
||
"github.com/topfans/backend/pkg/logger"
|
||
pbUser "github.com/topfans/backend/pkg/proto/user"
|
||
"github.com/topfans/backend/services/taskService/client"
|
||
"github.com/topfans/backend/services/taskService/config"
|
||
"github.com/topfans/backend/services/taskService/model"
|
||
"github.com/topfans/backend/services/taskService/provider"
|
||
"github.com/topfans/backend/services/taskService/repository"
|
||
"github.com/topfans/backend/services/taskService/service"
|
||
"github.com/topfans/backend/services/taskService/worker"
|
||
)
|
||
|
||
var port = flag.Int("port", 20005, "Dubbo service port")
|
||
|
||
func main() {
|
||
flag.Parse()
|
||
|
||
// 1. Init logger(必须最前)
|
||
env := os.Getenv("ENV")
|
||
if env == "" {
|
||
env = "development"
|
||
}
|
||
if err := logger.Init(logger.Config{ServiceName: "task-service", Environment: env, LogLevel: os.Getenv("LOG_LEVEL")}); err != nil {
|
||
panic(fmt.Sprintf("Failed to init logger: %v", err))
|
||
}
|
||
defer logger.Sync()
|
||
logger.Logger.Info("Starting taskService...")
|
||
|
||
// 2. Init config(读取 flags/env)
|
||
config.InitConfig()
|
||
|
||
// 3. Init database + auto-migrate
|
||
dbConfig := database.Config{
|
||
Host: config.DBConfig.Host,
|
||
Port: config.DBConfig.Port,
|
||
User: config.DBConfig.User,
|
||
Password: config.DBConfig.Password,
|
||
DBName: config.DBConfig.DBName,
|
||
SSLMode: config.DBConfig.SSLMode,
|
||
TimeZone: "Asia/Shanghai",
|
||
}
|
||
if err := database.Init(dbConfig); err != nil {
|
||
logger.Logger.Fatal(fmt.Sprintf("Failed to init DB: %v", err))
|
||
}
|
||
db := database.GetDB()
|
||
if err := db.AutoMigrate(
|
||
&model.TaskDefinition{},
|
||
&model.UserDailyTaskProgress{},
|
||
&model.UserOnboardingProgress{},
|
||
&model.UserOnboardingStatus{},
|
||
&model.OnboardingStageConfig{},
|
||
&model.ExhibitionRevenueRecord{},
|
||
&model.TaskResetLog{},
|
||
); err != nil {
|
||
logger.Logger.Fatal(fmt.Sprintf("Failed to migrate tables: %v", err))
|
||
}
|
||
logger.Logger.Info("Database initialized")
|
||
|
||
// 4. Init repositories
|
||
dailyRepo := repository.NewDailyTaskRepository(db)
|
||
onboardingRepo := repository.NewOnboardingRepository(db)
|
||
revenueRepo := repository.NewRevenueRepository(db)
|
||
logger.Logger.Info("Repositories initialized")
|
||
|
||
// 5. Init userService Dubbo client + RPC client
|
||
userCli, err := dubboclient.NewClient(
|
||
dubboclient.WithClientURL(config.ServiceURLsConfig.UserService),
|
||
)
|
||
if err != nil {
|
||
logger.Logger.Fatal(fmt.Sprintf("Failed to create userService client: %v", err))
|
||
}
|
||
userServiceClient, err := pbUser.NewUserSocialService(userCli)
|
||
if err != nil {
|
||
logger.Logger.Fatal(fmt.Sprintf("Failed to get userService: %v", err))
|
||
}
|
||
userRPCClient := client.NewUserServiceClient(userServiceClient)
|
||
logger.Logger.Info("User RPC client initialized")
|
||
|
||
// 6. Init services
|
||
dailySvc := service.NewDailyTaskService(dailyRepo, userRPCClient)
|
||
onboardingSvc := service.NewOnboardingService(onboardingRepo, dailyRepo, userRPCClient)
|
||
revenueSvc := service.NewRevenueService(revenueRepo, userRPCClient)
|
||
logger.Logger.Info("Services initialized")
|
||
|
||
// 7. Init worker(goroutine 中启动)
|
||
resetWorker := worker.NewDailyResetWorker(dailyRepo, revenueRepo, userRPCClient)
|
||
go resetWorker.Start()
|
||
logger.Logger.Info("Reset worker started")
|
||
|
||
// 8. Init providers
|
||
mobileProvider := provider.NewTaskMobileProvider(dailySvc, onboardingSvc, revenueSvc)
|
||
internalProvider := provider.NewTaskInternalProvider(onboardingSvc, revenueSvc)
|
||
logger.Logger.Info("Providers initialized")
|
||
|
||
// 9. Create Dubbo server on port 20005
|
||
srv, err := server.NewServer(
|
||
server.WithServerProtocol(
|
||
protocol.WithPort(*port),
|
||
protocol.WithTriple(),
|
||
),
|
||
)
|
||
if err != nil {
|
||
logger.Logger.Fatal(fmt.Sprintf("Failed to create server: %v", err))
|
||
}
|
||
|
||
// 注意:这里需要 TaskMobileService 和 TaskInternalService 的 RegisterHandler
|
||
// 这些会在 proto 编译后生成。在 proto 编译之前,这里会报编译错误。
|
||
// Task 15 完成 proto 编译后,需要将下面的注释替换为实际的注册代码。
|
||
|
||
logger.Logger.Info(fmt.Sprintf("taskService configured on port %d, awaiting proto registration", *port))
|
||
|
||
// 10. Graceful shutdown
|
||
quit := make(chan os.Signal, 1)
|
||
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
|
||
<-quit
|
||
logger.Logger.Info("Shutting down taskService...")
|
||
resetWorker.Stop()
|
||
}
|