main.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package main
  2. import (
  3. "context"
  4. "flag"
  5. "fmt"
  6. "github.com/cloudflare/tableflip"
  7. "github.com/gin-gonic/gin"
  8. "github.com/robfig/cron/v3"
  9. "log"
  10. "net/http"
  11. "os"
  12. "os/signal"
  13. "runtime"
  14. "syscall"
  15. "time"
  16. "zhiyuan/pkg/config"
  17. "zhiyuan/pkg/db"
  18. "zhiyuan/pkg/logger"
  19. "zhiyuan/pkg/redis"
  20. "zhiyuan/pkg/sms"
  21. "zhiyuan/pkg/validate"
  22. "zhiyuan/routers"
  23. )
  24. func init() {
  25. config.Setup()
  26. logger.Setup()
  27. db.Setup()
  28. redis.Setup()
  29. validate.Setup()
  30. sms.Setup()
  31. }
  32. func main() {
  33. c := cron.New(cron.WithSeconds())
  34. c.AddFunc("0 0 0 * * *", func() {
  35. //logger.Sugar.Infof("Run cron")
  36. //worksitecheck.CheckCron()
  37. })
  38. c.Start()
  39. gin.SetMode(config.Cfg.Server.RunMode)
  40. r := routers.InitRouters()
  41. readTimeout := config.Cfg.Server.ReadTimeout
  42. writeTimeout := config.Cfg.Server.WriteTimeout
  43. endPoint := fmt.Sprintf(":%d", config.Cfg.Server.HttpPort)
  44. maxHeaderBytes := 1 << 20
  45. server := &http.Server{
  46. Addr: endPoint,
  47. Handler: r,
  48. ReadTimeout: readTimeout,
  49. WriteTimeout: writeTimeout,
  50. MaxHeaderBytes: maxHeaderBytes,
  51. }
  52. var (
  53. listenAddr = flag.String("listen", "localhost"+endPoint, "`Address` to listen on")
  54. pidFile = flag.String("pid-file", config.Cfg.Server.PidFile, "`Path` to pid file")
  55. )
  56. flag.Parse()
  57. log.SetPrefix(fmt.Sprintf("%d ", os.Getpid()))
  58. // 1. 判断当前是否为 Windows 平台
  59. if runtime.GOOS == "windows" {
  60. startServer(r, endPoint)
  61. } else {
  62. upg, err := tableflip.New(tableflip.Options{
  63. PIDFile: *pidFile,
  64. })
  65. if err != nil {
  66. panic(err)
  67. }
  68. defer upg.Stop()
  69. // Do an upgrade on SIGHUP
  70. go func() {
  71. sig := make(chan os.Signal, 1)
  72. signal.Notify(sig, syscall.SIGHUP)
  73. for range sig {
  74. err := upg.Upgrade()
  75. if err != nil {
  76. log.Println("Upgrade failed:", err)
  77. }
  78. }
  79. }()
  80. // Listen must be called before Ready
  81. ln, err := upg.Listen("tcp", *listenAddr)
  82. if err != nil {
  83. log.Fatalln("Can't listen:", err)
  84. }
  85. go func() {
  86. err := server.Serve(ln)
  87. if err != http.ErrServerClosed {
  88. log.Println("HTTP server:", err)
  89. }
  90. }()
  91. log.Printf("ready listen %s", endPoint)
  92. if err := upg.Ready(); err != nil {
  93. panic(err)
  94. }
  95. //models.WorkSiteAddReturnVisit()
  96. <-upg.Exit()
  97. // Make sure to set a deadline on exiting the process
  98. // after upg.Exit() is closed. No new upgrades can be
  99. // performed if the parent doesn't exit.
  100. time.AfterFunc(30*time.Second, func() {
  101. log.Println("Graceful shutdown timed out")
  102. os.Exit(1)
  103. })
  104. // Wait for connections to drain.
  105. server.Shutdown(context.Background())
  106. }
  107. }
  108. // 标准启动方式(Windows 使用)
  109. func startServer(router *gin.Engine, addr string) {
  110. server := &http.Server{
  111. Addr: addr,
  112. Handler: router,
  113. }
  114. log.Printf("✅ 服务已启动,监听地址 %s\n", addr)
  115. log.Printf("👉 测试命令: curl http://localhost%s\n", addr)
  116. if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  117. log.Fatalf("❌ 服务启动失败: %v\n", err)
  118. }
  119. }