main.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "time"
  7. "github.com/xinliangnote/go-gin-api/configs"
  8. "github.com/xinliangnote/go-gin-api/internal/router"
  9. "github.com/xinliangnote/go-gin-api/pkg/env"
  10. "github.com/xinliangnote/go-gin-api/pkg/logger"
  11. "github.com/xinliangnote/go-gin-api/pkg/shutdown"
  12. "github.com/xinliangnote/go-gin-api/pkg/timeutil"
  13. "go.uber.org/zap"
  14. )
  15. // @title swagger 接口文档
  16. // @version 2.0
  17. // @description
  18. // @contact.name
  19. // @contact.url
  20. // @contact.email
  21. // @license.name MIT
  22. // @license.url https://github.com/xinliangnote/go-gin-api/blob/master/LICENSE
  23. // @securityDefinitions.apikey LoginToken
  24. // @in header
  25. // @name token
  26. // @BasePath /
  27. func main() {
  28. // 初始化 access logger
  29. accessLogger, err := logger.NewJSONLogger(
  30. logger.WithDisableConsole(),
  31. logger.WithField("domain", fmt.Sprintf("%s[%s]", configs.ProjectName, env.Active().Value())),
  32. logger.WithTimeLayout(timeutil.CSTLayout),
  33. logger.WithFileP(configs.ProjectAccessLogFile),
  34. )
  35. if err != nil {
  36. panic(err)
  37. }
  38. // 初始化 cron logger
  39. cronLogger, err := logger.NewJSONLogger(
  40. logger.WithDisableConsole(),
  41. logger.WithField("domain", fmt.Sprintf("%s[%s]", configs.ProjectName, env.Active().Value())),
  42. logger.WithTimeLayout(timeutil.CSTLayout),
  43. logger.WithFileP(configs.ProjectCronLogFile),
  44. )
  45. if err != nil {
  46. panic(err)
  47. }
  48. defer func() {
  49. _ = accessLogger.Sync()
  50. _ = cronLogger.Sync()
  51. }()
  52. // 初始化 HTTP 服务
  53. s, err := router.NewHTTPServer(accessLogger, cronLogger)
  54. if err != nil {
  55. panic(err)
  56. }
  57. server := &http.Server{
  58. Addr: configs.ProjectPort,
  59. Handler: s.Mux,
  60. }
  61. go func() {
  62. if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  63. accessLogger.Fatal("http server startup err", zap.Error(err))
  64. }
  65. }()
  66. // 优雅关闭
  67. shutdown.NewHook().Close(
  68. // 关闭 http server
  69. func() {
  70. ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
  71. defer cancel()
  72. if err := server.Shutdown(ctx); err != nil {
  73. accessLogger.Error("server shutdown err", zap.Error(err))
  74. }
  75. },
  76. // 关闭 db
  77. func() {
  78. if s.Db != nil {
  79. if err := s.Db.DbWClose(); err != nil {
  80. accessLogger.Error("dbw close err", zap.Error(err))
  81. }
  82. if err := s.Db.DbRClose(); err != nil {
  83. accessLogger.Error("dbr close err", zap.Error(err))
  84. }
  85. }
  86. },
  87. // 关闭 cache
  88. func() {
  89. if s.Cache != nil {
  90. if err := s.Cache.Close(); err != nil {
  91. accessLogger.Error("cache close err", zap.Error(err))
  92. }
  93. }
  94. },
  95. // 关闭 cron Server
  96. func() {
  97. if s.CronServer != nil {
  98. s.CronServer.Stop()
  99. }
  100. },
  101. )
  102. }