Gin 设置不同启动模式、优雅启动和关闭、运行多个不同端口的服务进程
1. 设置不同的启动模式
SetMode()这个函数来设置运行的模式,有三种模式可以设置,分别为
gin.ReleaseMode gin.TestMode gin.DebugMode
正式发布时应该设置为发布模式。
func NoResponse(c *gin.Context) { // 返回 404 状态码 c.String(http.StatusNotFound, "404, page not exists!") } func main() { // 正式发布模式 gin.SetMode(gin.ReleaseMode) router := gin.Default() // 设定请求 url 不存在的返回值 router.NoRoute(NoResponse) router.Run(":8080") }
运行结果:
$ go run main.go [GIN] 2022/07/14 - 15:11:23 | 404 | 8.683µs | 127.0.0.1 | GET "/v2/login"
2. 优雅的关闭和启动
我们可以使用 fvbock/endless 来替换默认的 ListenAndServe. 可以参考 #296 有更多的细节。
router := gin.Default() router.GET("/", handler) // [...] endless.ListenAndServe(":4242", router)
其它可选的方案
manners: A polite Go HTTP server that shuts down gracefully. graceful: Graceful is a Go package enabling graceful shutdown of an http.Handler server. grace: Graceful restart & zero downtime deploy for Go servers.
3. 运行多个不同端口的服务进程
参考 question ,使用下面代码尝试实现:
package main import ( "log" "net/http" "time" "github.com/gin-gonic/gin" "golang.org/x/sync/errgroup" ) var ( g errgroup.Group ) func router01() http.Handler { e := gin.New() e.Use(gin.Recovery()) e.GET("/", func(c *gin.Context) { c.JSON( http.StatusOK, gin.H{ "code": http.StatusOK, "message": "Welcome server 01", }, ) }) return e } func router02() http.Handler { e := gin.New() e.Use(gin.Recovery()) e.GET("/", func(c *gin.Context) { c.JSON( http.StatusOK, gin.H{ "code": http.StatusOK, "message": "Welcome server 02", }, ) }) return e } func main() { server01 := &http.Server{ Addr: ":8080", Handler: router01(), ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, } server02 := &http.Server{ Addr: ":8081", Handler: router02(), ReadTimeout: 5 * time.Second, WriteTimeout: 10 * time.Second, } g.Go(func() error { return server01.ListenAndServe() }) g.Go(func() error { return server02.ListenAndServe() }) if err := g.Wait(); err != nil { log.Fatal(err) } }