fix: 服务监听失败每5秒重试最多10次
This commit is contained in:
8
.vscode/launch.json
vendored
8
.vscode/launch.json
vendored
@@ -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
210
main.go
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user