105 lines
2.8 KiB
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)
|
|
}
|
|
}
|
|
}
|