// entry function package main import ( "context" "flag" "time" "modelRT/config" "modelRT/database" "modelRT/handler" "modelRT/log" "modelRT/middleware" "modelRT/model" "github.com/gin-gonic/gin" "github.com/panjf2000/ants/v2" "go.uber.org/zap" "gorm.io/gorm" ) var limiter *middleware.Limiter func init() { limiter = middleware.NewLimiter(10, 1*time.Minute) // 设置限流器,允许每分钟最多请求10次 } var ( modelRTConfigDir = flag.String("modelRT_config_dir", "./config", "config file dir of model runtime service") modelRTConfigName = flag.String("modelRT_config_name", "config", "config file name of model runtime service") modelRTConfigType = flag.String("modelRT_config_type", "yaml", "config file type of model runtime service") ) var ( modelRTConfig config.ModelRTConfig postgresDBClient *gorm.DB logger *zap.Logger ) // TODO 使用 wire 依赖注入 func main() { flag.Parse() ctx := context.TODO() modelRTConfig = config.ReadAndInitConfig(*modelRTConfigDir, *modelRTConfigName, *modelRTConfigType) // init postgresDBClient postgresDBClient = database.GetPostgresDBInstance(ctx, modelRTConfig.PostgresDBURI) defer func() { sqlDB, err := postgresDBClient.DB() if err != nil { panic(err) } sqlDB.Close() }() // init logger logger = log.GetLoggerInstance(modelRTConfig.LoggerConfig) defer logger.Sync() // init ants pool pool, err := ants.NewPoolWithFunc(modelRTConfig.ParseConcurrentQuantity, model.ParseFunc) if err != nil { logger.Error("init concurrent parse task pool failed", zap.Error(err)) panic(err) } defer ants.Release() // load circuit diagram from postgres err = database.QueryCircuitDiagramComponentFromDB(ctx, pool, logger) if err != nil { logger.Error("load circuit diagrams from postgres failed", zap.Error(err)) panic(err) } err = database.QueryTopologicFromDB(ctx, logger, modelRTConfig.GridID, modelRTConfig.ZoneID, modelRTConfig.StationID) if err != nil { logger.Error("load topologic info from postgres failed", zap.Error(err)) panic(err) } engine := gin.Default() engine.Use(limiter.Middleware) engine.GET("/model/diagram_load", handler.CircuitDiagramLoadHandler) engine.POST("/model/diagram_create", nil) engine.POST("/model/diagram_update", nil) engine.POST("/model/diagram_delete", nil) // start route with 8080 port engine.Run(":8080") // Redis hashmap 母线模型、异步电动机模型 // kv key name value busx }