run.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package lxrun
  2. import (
  3. "context"
  4. "fmt"
  5. "git.listensoft.net/tool/lxutils/lxDb"
  6. "git.listensoft.net/tool/lxutils/lxlog"
  7. "git.listensoft.net/tool/lxutils/lxzap"
  8. "github.com/gin-gonic/gin"
  9. "log"
  10. "net/http"
  11. "os"
  12. "os/signal"
  13. "syscall"
  14. "time"
  15. )
  16. func Run(env string, port string, fun func(), r func(router *gin.Engine), zapConfig lxzap.LogConfig, dbConf lxDb.DbConfig, redisConf lxDb.RedisConfig) {
  17. _ = lxlog.InitLog()
  18. err := lxzap.InitLogger(zapConfig)
  19. if err != nil {
  20. panic(err.Error())
  21. }
  22. app := gin.New()
  23. // 注册zap相关中间件
  24. if env == "dev" {
  25. app.Use(gin.Logger(), gin.Recovery())
  26. } else {
  27. app.Use(lxzap.GinLogger(), lxzap.GinRecovery(true))
  28. }
  29. lxDb.InitDB(env, dbConf)
  30. lxDb.InitRedis(redisConf)
  31. fun()
  32. r(app)
  33. srv := http.Server{
  34. Addr: ":" + port,
  35. Handler: app,
  36. }
  37. // make sure idle connections returned
  38. processed := make(chan struct{})
  39. go func() {
  40. c := make(chan os.Signal, 1)
  41. signal.Notify(c, os.Interrupt, syscall.SIGTERM)
  42. <-c
  43. fmt.Println("ctrl + c")
  44. ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
  45. defer cancel()
  46. if err := srv.Shutdown(ctx); nil != err {
  47. log.Fatalf("server shutdown failed, err: %v\n", err)
  48. }
  49. log.Println("server gracefully shutdown")
  50. processed <- struct{}{}
  51. }()
  52. // serve
  53. err = srv.ListenAndServe()
  54. if http.ErrServerClosed != err {
  55. log.Fatalf("server not gracefully shutdown, err :%v\n", err)
  56. }
  57. // waiting for goroutine above processed
  58. <-processed
  59. }