eventRT/main.go

105 lines
2.8 KiB
Go

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