fix: 服务监听失败每5秒重试最多10次

This commit is contained in:
TsMask
2025-07-15 16:13:34 +08:00
parent 150551acce
commit be7da57171
2 changed files with 98 additions and 122 deletions

10
.vscode/launch.json vendored
View File

@@ -12,14 +12,6 @@
"program": "main.go", "program": "main.go",
"console": "integratedTerminal", "console": "integratedTerminal",
"args": ["--env", "local", "-c", "./local/omc.yaml"] "args": ["--env", "local", "-c", "./local/omc.yaml"]
}, }
{
"name": "debug sshsvc",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "sshsvc/sshsvc.go",
"console": "integratedTerminal"
}
] ]
} }

210
main.go
View File

@@ -4,6 +4,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"sync" "sync"
"time"
_ "net/http/pprof" _ "net/http/pprof"
@@ -14,22 +15,17 @@ import (
swaggerFiles "github.com/swaggo/files" swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger" 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"
"be.ems/src/framework/config" "be.ems/src/framework/config"
"be.ems/src/framework/logger" "be.ems/src/framework/logger"
"be.ems/src/framework/middleware"
"be.ems/src/framework/utils/machine" "be.ems/src/framework/utils/machine"
"be.ems/src/framework/utils/parse" "be.ems/src/framework/utils/parse"
_ "be.ems/swagger_docs" _ "be.ems/swagger_docs"
) )
var wg sync.WaitGroup var wg sync.WaitGroup // 等待服务
var maxRetries = 10 // 最大重试次数
var retryInterval = 5 * time.Second // 重试间隔时间
// @title OMC Swagger API // @title OMC Swagger API
// @version 1.0.8 // @version 1.0.8
@@ -156,9 +152,7 @@ func main() {
src.ModulesRoute(app) src.ModulesRoute(app)
loadFeatures(app) loadServerRoute(app)
loadServer(app)
loadServerWeb() loadServerWeb()
@@ -167,33 +161,6 @@ func main() {
wg.Wait() 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 全局预加载 // loadGlobalPre 全局预加载
func loadGlobalPre(app *gin.Engine) { func loadGlobalPre(app *gin.Engine) {
// Swagger 接口文档 // Swagger 接口文档
@@ -217,61 +184,61 @@ func loadGlobalPre(app *gin.Engine) {
wg.Add(1) wg.Add(1)
go func(addr string) { go func(addr string) {
defer wg.Done() 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) }(pprofAddr)
} }
} }
// loadServer 多个HTTP服务启动 // loadServerRoute 多个HTTP服务启动-API服务
func loadServer(app *gin.Engine) { func loadServerRoute(app *gin.Engine) {
httpArr := config.Get("server") routeArr := config.Get("routeServer")
if httpArr == nil { if routeArr == nil {
logger.Errorf("server config not found") logger.Errorf("routeServer config not found")
return return
} }
for _, v := range httpArr.([]any) { for _, v := range routeArr.([]any) {
item := v.(map[string]any) item := v.(map[string]any)
port := parse.Number(item["port"]) addr := fmt.Sprint(item["addr"])
ipv4 := fmt.Sprint(item["ipv4"]) if addr == "" || addr == "<nil>" {
ipv6 := fmt.Sprint(item["ipv6"]) continue
}
schema := fmt.Sprint(item["schema"]) schema := fmt.Sprint(item["schema"])
if schema == "https" && schema != "<nil>" { if schema == "https" && schema != "<nil>" {
certFile := fmt.Sprint(item["certfile"]) certFile := fmt.Sprint(item["certfile"])
keyFile := fmt.Sprint(item["keyfile"]) keyFile := fmt.Sprint(item["keyfile"])
addr := "" if certFile == "" || certFile == "<nil>" || keyFile == "" || keyFile == "<nil>" {
if ipv4 != "" && ipv4 != "<nil>" {
addr = fmt.Sprintf("%s:%d", ipv4, port)
}
if ipv6 != "" && ipv6 != "<nil>" {
addr = fmt.Sprintf("[%s]:%d", ipv6, port)
}
if addr == "" {
continue continue
} }
// 启动HTTPS服务 // 启动HTTPS服务
wg.Add(1) wg.Add(1)
go func(addr string, certFile string, keyFile string) { go func(addr string, certFile string, keyFile string) {
defer wg.Done() defer wg.Done()
err := app.RunTLS(addr, certFile, keyFile) for i := range maxRetries {
logger.Errorf("run tls err:%v", err) 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) }(addr, certFile, keyFile)
} else { } else {
addr := ""
if ipv4 != "" && ipv4 != "<nil>" {
addr = fmt.Sprintf("%s:%d", ipv4, port)
}
if ipv6 != "" && ipv6 != "<nil>" {
addr = fmt.Sprintf("[%s]:%d", ipv6, port)
}
if addr == "" {
continue
}
// 启动HTTP服务 // 启动HTTP服务
wg.Add(1) wg.Add(1)
go func(addr string) { go func(addr string) {
defer wg.Done() defer wg.Done()
err := app.Run(addr) for i := range maxRetries {
logger.Errorf("run err:%v", err) 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) }(addr)
} }
} }
@@ -279,52 +246,69 @@ func loadServer(app *gin.Engine) {
// loadServerWeb 多个HTTP服务启动-前端静态资源 // loadServerWeb 多个HTTP服务启动-前端静态资源
func loadServerWeb() { func loadServerWeb() {
webEnabled := config.Get("webServer.enabled") webEnabled := parse.Boolean(config.Get("webServer.enabled"))
if webEnabled == nil { if !webEnabled {
logger.Errorf("webServer config not found") logger.Warnf("webServer config not found")
return return
} }
if webEnabled.(bool) { rootDir := fmt.Sprint(config.Get("webServer.rootDir"))
rootDir := config.Get("webServer.rootDir").(string) if rootDir == "" || rootDir == "<nil>" {
if rootDir != "" { logger.Warnf("webServer rootDir config not found")
var web *gin.Engine return
gin.SetMode(gin.ReleaseMode) }
web = gin.New()
web.Use(gin.Recovery()) var web *gin.Engine = gin.New()
gin.DisableConsoleColor() gin.SetMode(gin.ReleaseMode)
web.StaticFS("/", http.Dir(rootDir)) gin.DisableConsoleColor()
// 多个HTTP服务启动 web.Use(gin.Recovery())
listenArr := config.Get("webServer.listen") web.StaticFS("/", http.Dir(rootDir))
for _, v := range listenArr.([]any) { // 多个HTTP服务启动
listen := v.(map[string]any) listenArr := config.Get("webServer.listen")
addr := fmt.Sprint(listen["addr"]) if listenArr == nil {
schema := fmt.Sprint(listen["schema"]) logger.Errorf("webServer listen config not found")
if schema == "https" && schema != "<nil>" { return
certFile := fmt.Sprint(listen["certfile"]) }
keyFile := fmt.Sprint(listen["keyfile"]) for _, v := range listenArr.([]any) {
if addr == "" || addr == "<nil>" { listen := v.(map[string]any)
continue addr := fmt.Sprint(listen["addr"])
} if addr == "" || addr == "<nil>" {
// 启动HTTPS服务 continue
wg.Add(1) }
go func(addr string, certFile string, keyFile string) { schema := fmt.Sprint(listen["schema"])
defer wg.Done() if schema == "https" && schema != "<nil>" {
err := web.RunTLS(addr, certFile, keyFile) certFile := fmt.Sprint(listen["certfile"])
logger.Errorf("web run tls err:%v", err) keyFile := fmt.Sprint(listen["keyfile"])
}(addr, certFile, keyFile) if certFile == "" || certFile == "<nil>" || keyFile == "" || keyFile == "<nil>" {
} else { continue
if addr == "" || addr == "<nil>" {
continue
}
// 启动HTTP服务
wg.Add(1)
go func(addr string) {
defer wg.Done()
err := web.Run(addr)
logger.Errorf("web run err:%v", err)
}(addr)
}
} }
// 启动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 == "<nil>" {
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)
} }
} }
} }