run.go 1.2 KB

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