|
@@ -0,0 +1,55 @@
|
|
|
|
+package lxrun
|
|
|
|
+
|
|
|
|
+import (
|
|
|
|
+ "context"
|
|
|
|
+ "fmt"
|
|
|
|
+ "git.listensoft.net/tool/lxutils/lxlog"
|
|
|
|
+ "git.listensoft.net/tool/lxutils/lxzap"
|
|
|
|
+ "github.com/gin-gonic/gin"
|
|
|
|
+ "log"
|
|
|
|
+ "net/http"
|
|
|
|
+ "os"
|
|
|
|
+ "os/signal"
|
|
|
|
+ "syscall"
|
|
|
|
+ "time"
|
|
|
|
+)
|
|
|
|
+
|
|
|
|
+func Run(env string, port string, fun func(), r func(router *gin.Engine)) {
|
|
|
|
+ _ = lxlog.InitLog()
|
|
|
|
+ app := gin.New()
|
|
|
|
+ // 注册zap相关中间件
|
|
|
|
+ if env == "dev" {
|
|
|
|
+ app.Use(gin.Logger(), gin.Recovery())
|
|
|
|
+ } else {
|
|
|
|
+ app.Use(lxzap.GinLogger(), lxzap.GinRecovery(true))
|
|
|
|
+ }
|
|
|
|
+ fun()
|
|
|
|
+ r(app)
|
|
|
|
+ srv := http.Server{
|
|
|
|
+ Addr: ":" + port,
|
|
|
|
+ Handler: app,
|
|
|
|
+ }
|
|
|
|
+ // make sure idle connections returned
|
|
|
|
+ processed := make(chan struct{})
|
|
|
|
+ go func() {
|
|
|
|
+ c := make(chan os.Signal, 1)
|
|
|
|
+ signal.Notify(c, os.Interrupt, syscall.SIGTERM)
|
|
|
|
+ <-c
|
|
|
|
+ fmt.Println("ctrl + c")
|
|
|
|
+ ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
|
|
|
|
+ defer cancel()
|
|
|
|
+ if err := srv.Shutdown(ctx); nil != err {
|
|
|
|
+ log.Fatalf("server shutdown failed, err: %v\n", err)
|
|
|
|
+ }
|
|
|
|
+ log.Println("server gracefully shutdown")
|
|
|
|
+
|
|
|
|
+ processed <- struct{}{}
|
|
|
|
+ }()
|
|
|
|
+ // serve
|
|
|
|
+ err := srv.ListenAndServe()
|
|
|
|
+ if http.ErrServerClosed != err {
|
|
|
|
+ log.Fatalf("server not gracefully shutdown, err :%v\n", err)
|
|
|
|
+ }
|
|
|
|
+ // waiting for goroutine above processed
|
|
|
|
+ <-processed
|
|
|
|
+}
|