// entry function package main import ( "context" "errors" "flag" "fmt" "log" "net/http" "os" "os/signal" "path/filepath" "syscall" "eventRT/config" "eventRT/constants" "eventRT/database" "eventRT/logger" "eventRT/mq" "eventRT/util" "github.com/gin-gonic/gin" ) var ( eventRTConfigDir = flag.String("eventRT_config_dir", "./configs", "config file dir") eventRTConfigName = flag.String("eventRT_config_name", "config", "config file name") eventRTConfigType = flag.String("eventRT_config_type", "yaml", "config file type") ) func main() { flag.Parse() ctx := context.TODO() configPath := filepath.Join(*eventRTConfigDir, *eventRTConfigName+"."+*eventRTConfigType) if _, err := os.Stat(configPath); os.IsNotExist(err) { log.Println("configuration file not found,checking for example file") exampleConfigPath := filepath.Join(*eventRTConfigDir, *eventRTConfigName+".example."+*eventRTConfigType) configDir := filepath.Dir(configPath) if err := os.MkdirAll(configDir, 0o755); err != nil { panic(fmt.Errorf("failed to create config directory %s:%w", configDir, err)) } if _, err := os.Stat(exampleConfigPath); err == nil { if err := util.CopyFile(exampleConfigPath, configPath); err != nil { panic(fmt.Errorf("failed to copy example config file:%w", err)) } } else { panic(errors.New("no config file and no config example file found")) } } eventRTConfig := config.ReadAndInitConfig(*eventRTConfigDir, *eventRTConfigName, *eventRTConfigType) logger.InitLoggerInstance(eventRTConfig.LoggerConfig) mongoDBClient := database.InitMongoInstance(ctx, eventRTConfig.MongoDBConfig) // TODO 等待删除 fmt.Println(mongoDBClient) rabbitConn := mq.InitRabbitMQ(eventRTConfig.RabbitMQConfig) defer rabbitConn.Close() // use release mode in production if eventRTConfig.DeployEnv == constants.ProductionDeployMode { gin.SetMode(gin.ReleaseMode) } engine := gin.New() engine.Use(gin.Logger(), gin.Recovery()) // TODO k8s liveness & readiness probe endpoints // engine.GET("/ping", func(c *gin.Context) { // c.JSON(200, gin.H{"status": "ok"}) // }) server := http.Server{ Addr: eventRTConfig.ServiceAddr, Handler: engine, } // creating a System Signal Receiver done := make(chan os.Signal, 10) signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) go func() { <-done if err := server.Shutdown(context.Background()); err != nil { logger.Error(ctx, "shutdown serverError", "err", err) } }() logger.Info(ctx, "starting EventRT server") err := server.ListenAndServe() if err != nil { if err == http.ErrServerClosed { // the service receives the shutdown signal normally and then closes logger.Info(ctx, "server closed under request") } else { // abnormal shutdown of service logger.Error(ctx, "server closed unexpected", "err", err) } } }