From be7da5717156c4745837f7c7963437d8ab8cc958 Mon Sep 17 00:00:00 2001 From: TsMask <340112800@qq.com> Date: Tue, 15 Jul 2025 16:13:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=9C=8D=E5=8A=A1=E7=9B=91=E5=90=AC?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E6=AF=8F5=E7=A7=92=E9=87=8D=E8=AF=95?= =?UTF-8?q?=E6=9C=80=E5=A4=9A10=E6=AC=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 10 +-- main.go | 210 ++++++++++++++++++++------------------------ 2 files changed, 98 insertions(+), 122 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index f549ed53..498a7341 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,14 +12,6 @@ "program": "main.go", "console": "integratedTerminal", "args": ["--env", "local", "-c", "./local/omc.yaml"] - }, - { - "name": "debug sshsvc", - "type": "go", - "request": "launch", - "mode": "debug", - "program": "sshsvc/sshsvc.go", - "console": "integratedTerminal" - } + } ] } \ No newline at end of file diff --git a/main.go b/main.go index 1a632049..9f070bf7 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "fmt" "net/http" "sync" + "time" _ "net/http/pprof" @@ -14,22 +15,17 @@ import ( swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" - "be.ems/features" - "be.ems/features/event" - "be.ems/features/mml" - featuresCfg "be.ems/lib/config" - "be.ems/lib/log" - "be.ems/lib/routes" "be.ems/src" "be.ems/src/framework/config" "be.ems/src/framework/logger" - "be.ems/src/framework/middleware" "be.ems/src/framework/utils/machine" "be.ems/src/framework/utils/parse" _ "be.ems/swagger_docs" ) -var wg sync.WaitGroup +var wg sync.WaitGroup // 等待服务 +var maxRetries = 10 // 最大重试次数 +var retryInterval = 5 * time.Second // 重试间隔时间 // @title OMC Swagger API // @version 1.0.8 @@ -156,9 +152,7 @@ func main() { src.ModulesRoute(app) - loadFeatures(app) - - loadServer(app) + loadServerRoute(app) loadServerWeb() @@ -167,33 +161,6 @@ func main() { wg.Wait() } -// loadFeatures mux路由模块 -func loadFeatures(app *gin.Engine) { - conf := featuresCfg.GetYamlConfig() - - log.InitLogger(conf.Logger.File, conf.Logger.Duration, conf.Logger.Count, "omc:restagent", featuresCfg.GetLogLevel()) - // fmt.Printf("OMC Version: %s\n", config.Version) - // log.Infof("========================= OMC Startup =========================") - // log.Infof("OMC Version: %s %s %s", config.Version, config.BuildTime, config.GoVer) - - mml.InitMML() - - // 将 mux.Router 注册到 gin.Engine - - // 默认路由组 - defaultUriGroup := app.Group(featuresCfg.DefaultUriPrefix) - defaultUriGroup.Use(middleware.AuthorizeUser(nil)) - defaultUriGroup.Any("/*any", gin.WrapH(routes.NewRouter())) - // 可配置前缀路由组 - uriGroup := app.Group(featuresCfg.UriPrefix) - uriGroup.Any("/*any", gin.WrapH(routes.NewRouter())) - // AMF上报的UE事件, 无前缀,暂时特殊处理 - app.POST(event.UriUEEventAMF, event.PostUEEventFromAMF) - - // register feature service gin.Engine - features.InitServiceEngine(app) -} - // loadGlobalPre 全局预加载 func loadGlobalPre(app *gin.Engine) { // Swagger 接口文档 @@ -217,61 +184,61 @@ func loadGlobalPre(app *gin.Engine) { wg.Add(1) go func(addr string) { defer wg.Done() - fmt.Println(http.ListenAndServe(addr, nil)) + for i := range maxRetries { + if err := http.ListenAndServe(addr, nil); err != nil { + logger.Errorf("pprof run err:%v", err) + time.Sleep(retryInterval) // 重试间隔时间 + logger.Warnf("trying to restart HTTP server on %s (Attempt %d)", addr, i) + } + } }(pprofAddr) } } -// loadServer 多个HTTP服务启动 -func loadServer(app *gin.Engine) { - httpArr := config.Get("server") - if httpArr == nil { - logger.Errorf("server config not found") +// loadServerRoute 多个HTTP服务启动-API服务 +func loadServerRoute(app *gin.Engine) { + routeArr := config.Get("routeServer") + if routeArr == nil { + logger.Errorf("routeServer config not found") return } - for _, v := range httpArr.([]any) { + for _, v := range routeArr.([]any) { item := v.(map[string]any) - port := parse.Number(item["port"]) - ipv4 := fmt.Sprint(item["ipv4"]) - ipv6 := fmt.Sprint(item["ipv6"]) + addr := fmt.Sprint(item["addr"]) + if addr == "" || addr == "" { + continue + } schema := fmt.Sprint(item["schema"]) if schema == "https" && schema != "" { certFile := fmt.Sprint(item["certfile"]) keyFile := fmt.Sprint(item["keyfile"]) - addr := "" - if ipv4 != "" && ipv4 != "" { - addr = fmt.Sprintf("%s:%d", ipv4, port) - } - if ipv6 != "" && ipv6 != "" { - addr = fmt.Sprintf("[%s]:%d", ipv6, port) - } - if addr == "" { + if certFile == "" || certFile == "" || keyFile == "" || keyFile == "" { continue } // 启动HTTPS服务 wg.Add(1) go func(addr string, certFile string, keyFile string) { defer wg.Done() - err := app.RunTLS(addr, certFile, keyFile) - logger.Errorf("run tls err:%v", err) + for i := range maxRetries { + if err := app.RunTLS(addr, certFile, keyFile); err != nil { + logger.Errorf("routeServer run tls err:%v", err) + time.Sleep(retryInterval) // 重试间隔时间 + logger.Warnf("trying to restart HTTPS server on %s (Attempt %d)", addr, i) + } + } }(addr, certFile, keyFile) } else { - addr := "" - if ipv4 != "" && ipv4 != "" { - addr = fmt.Sprintf("%s:%d", ipv4, port) - } - if ipv6 != "" && ipv6 != "" { - addr = fmt.Sprintf("[%s]:%d", ipv6, port) - } - if addr == "" { - continue - } // 启动HTTP服务 wg.Add(1) go func(addr string) { defer wg.Done() - err := app.Run(addr) - logger.Errorf("run err:%v", err) + for i := range maxRetries { + if err := app.Run(addr); err != nil { + logger.Errorf("routeServer run err:%v", err) + time.Sleep(retryInterval) // 重试间隔时间 + logger.Warnf("trying to restart HTTP server on %s (Attempt %d)", addr, i) + } + } }(addr) } } @@ -279,52 +246,69 @@ func loadServer(app *gin.Engine) { // loadServerWeb 多个HTTP服务启动-前端静态资源 func loadServerWeb() { - webEnabled := config.Get("webServer.enabled") - if webEnabled == nil { - logger.Errorf("webServer config not found") + webEnabled := parse.Boolean(config.Get("webServer.enabled")) + if !webEnabled { + logger.Warnf("webServer config not found") return } - if webEnabled.(bool) { - rootDir := config.Get("webServer.rootDir").(string) - if rootDir != "" { - var web *gin.Engine - gin.SetMode(gin.ReleaseMode) - web = gin.New() - web.Use(gin.Recovery()) - gin.DisableConsoleColor() - web.StaticFS("/", http.Dir(rootDir)) - // 多个HTTP服务启动 - listenArr := config.Get("webServer.listen") - for _, v := range listenArr.([]any) { - listen := v.(map[string]any) - addr := fmt.Sprint(listen["addr"]) - schema := fmt.Sprint(listen["schema"]) - if schema == "https" && schema != "" { - certFile := fmt.Sprint(listen["certfile"]) - keyFile := fmt.Sprint(listen["keyfile"]) - if addr == "" || addr == "" { - continue - } - // 启动HTTPS服务 - wg.Add(1) - go func(addr string, certFile string, keyFile string) { - defer wg.Done() - err := web.RunTLS(addr, certFile, keyFile) - logger.Errorf("web run tls err:%v", err) - }(addr, certFile, keyFile) - } else { - if addr == "" || addr == "" { - continue - } - // 启动HTTP服务 - wg.Add(1) - go func(addr string) { - defer wg.Done() - err := web.Run(addr) - logger.Errorf("web run err:%v", err) - }(addr) - } + rootDir := fmt.Sprint(config.Get("webServer.rootDir")) + if rootDir == "" || rootDir == "" { + logger.Warnf("webServer rootDir config not found") + return + } + + var web *gin.Engine = gin.New() + gin.SetMode(gin.ReleaseMode) + gin.DisableConsoleColor() + web.Use(gin.Recovery()) + web.StaticFS("/", http.Dir(rootDir)) + // 多个HTTP服务启动 + listenArr := config.Get("webServer.listen") + if listenArr == nil { + logger.Errorf("webServer listen config not found") + return + } + for _, v := range listenArr.([]any) { + listen := v.(map[string]any) + addr := fmt.Sprint(listen["addr"]) + if addr == "" || addr == "" { + continue + } + schema := fmt.Sprint(listen["schema"]) + if schema == "https" && schema != "" { + certFile := fmt.Sprint(listen["certfile"]) + keyFile := fmt.Sprint(listen["keyfile"]) + if certFile == "" || certFile == "" || keyFile == "" || keyFile == "" { + continue } + // 启动HTTPS服务 + wg.Add(1) + go func(addr string, certFile string, keyFile string) { + defer wg.Done() + for i := range maxRetries { + if err := web.RunTLS(addr, certFile, keyFile); err != nil { + logger.Errorf("webServer run tls err:%v", err) + time.Sleep(retryInterval) // 重试间隔时间 + logger.Warnf("trying to restart HTTPS server on %s (Attempt %d)", addr, i) + } + } + }(addr, certFile, keyFile) + } else { + if addr == "" || addr == "" { + continue + } + // 启动HTTP服务 + wg.Add(1) + go func(addr string) { + defer wg.Done() + for i := range maxRetries { + if err := web.Run(addr); err != nil { + logger.Errorf("webServer run err:%v", err) + time.Sleep(retryInterval) // 重试间隔时间 + logger.Warnf("trying to restart HTTP server on %s (Attempt %d)", addr, i) + } + } + }(addr) } } }