// entry function package main import ( "context" "flag" "time" "modelRT/config" "modelRT/database" _ "modelRT/docs" "modelRT/handler" "modelRT/log" "modelRT/middleware" "modelRT/pool" subscription "modelRT/real-time-data" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" "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 依赖注入管理 DVIE 面板注册的 panel func main() { flag.Parse() ctx := context.TODO() modelRTConfig = config.ReadAndInitConfig(*modelRTConfigDir, *modelRTConfigName, *modelRTConfigType) // init postgresDBClient postgresDBClient = database.InitPostgresDBInstance(ctx, modelRTConfig.PostgresDBURI) defer func() { sqlDB, err := postgresDBClient.DB() if err != nil { panic(err) } sqlDB.Close() }() // init logger logger = log.InitLoggerInstance(modelRTConfig.LoggerConfig) defer logger.Sync() // init ants pool pool, err := ants.NewPoolWithFunc(modelRTConfig.ParseConcurrentQuantity, pool.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) } // TODO 暂时屏蔽完成 swagger 启动测试 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) } // TODO 完成订阅数据分析 // TODO 暂时屏蔽完成 swagger 启动测试 go subscription.RealTimeDataComputer(ctx, nil, []string{}, "") engine := gin.Default() engine.Use(limiter.Middleware) // diagram api engine.GET("/model/diagram_load", handler.CircuitDiagramLoadHandler) engine.POST("/model/diagram_create", handler.CircuitDiagramCreateHandler) engine.POST("/model/diagram_update", handler.CircuitDiagramUpdateHandler) engine.POST("/model/diagram_delete", handler.CircuitDiagramDeleteHandler) // dashborad api dashboard := engine.Group("/dashboard", limiter.Middleware) { dashboard.GET("/load", nil) dashboard.GET("/query", nil) dashboard.POST("/create", nil) dashboard.POST("/update", nil) dashboard.POST("/delete", nil) } // engine.Group() // Swagger UI engine.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // 注册 Swagger UI 路由 // docs.SwaggerInfo.BasePath = "/model" // v1 := engine.Group("/api/v1") // { // eg := v1.Group("/example") // { // eg.GET("/helloworld", Helloworld) // } // } // start route with 8080 port engine.Run(":8080") // Redis hashmap 母线模型、异步电动机模型 // kv key name value busx }