diff --git a/app/mix/cmd/main.go b/app/mix/cmd/main.go index a8441262..1dee82bf 100644 --- a/app/mix/cmd/main.go +++ b/app/mix/cmd/main.go @@ -1,10 +1,13 @@ package main import ( + "context" "fmt" "net" "net/http" "os" + "os/exec" + "os/signal" "runtime" "service/api/consts" "service/app/mix/conf" @@ -18,7 +21,6 @@ import ( videomoderation "service/library/contentaudit/video_moderation" "service/library/dingtalk" "service/library/httpengine" - "service/library/httpserver" "service/library/logger" "service/library/middleware" "service/library/redis" @@ -26,6 +28,7 @@ import ( "service/library/sms" "service/library/validator" "strings" + "syscall" "time" ) @@ -130,8 +133,44 @@ func main() { Addr: fmt.Sprintf("%s:%d", ip, port), Handler: router, } - httpserver.StartHttpServer(srv, cfg.DefaultConfig, ip, port) + go func() { + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + logger.Fatal("listen: %v", err) + return + } + }() + + // 注册服务 + go func() { + err := registerSD(ip, port) + if err != nil { + logger.Fatal("registerSD: %v", err) + return + } + setServerStatusFD(ServerStatusFDRun) + }() + + quit := make(chan os.Signal, 1) + signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) + <-quit + + if err := servicediscovery.DeRegister(ip, port); err != nil { + logger.Fatal("DeRegister fail: %v", err) + } + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + if err := srv.Shutdown(ctx); err != nil { + logger.Fatal("Server Shutdown:", err) + } + defer cancel() + select { + case <-ctx.Done(): + logger.Info("timeout of 1 seconds.") + } + + logger.Info("Server exited") + setServerStatusFD(ServerStatusFDStop) } func PrintAndExit(msg string) { @@ -164,3 +203,47 @@ func GetIp() string { } return retIp } + +func registerSD(ip string, port int) error { + // 要等服务起来后再注册到consul,否则会有问题 + // 方法:调用 healthcheck + idx := 0 + timer := time.NewTimer(time.Second * 5) + timerRetry := time.NewTicker(time.Second * 1) + for { + select { + case <-timer.C: + return fmt.Errorf("registerSD fail, ip: %v, port: %v", ip, port) + case <-timerRetry.C: + idx += 1 + resp, err := http.Get(fmt.Sprintf("http://%s:%v/healthcheck", ip, port)) + if err != nil { + logger.Error("healthcheck fail, err: %v", err) + continue + } + if resp.StatusCode == http.StatusOK { + if err := servicediscovery.Register(ip, port); err != nil { + logger.Error("registerSD fail, ip: %v, port: %v, err: %v", ip, port, err) + continue + } + return nil + } + } + } +} + +func setServerStatusFD(status string) { + serverStatusFdPath := "/app/SERVER_STATUS_FD" + cmd := exec.Command("sh", "-c", fmt.Sprintf("echo %s > %s", status, serverStatusFdPath)) + err := cmd.Run() + if err != nil { + logger.Info("run cmd fail, p: %v, err: %v", serverStatusFdPath, err) + return + } + logger.Info("SetServerStatusFD success: %v", status) +} + +const ( + ServerStatusFDRun = "RUN" // 服务运行中 + ServerStatusFDStop = "STOP" // 服务停止 +)