feat: Add gracefully shut down methods for gin

This commit is contained in:
侯尧 2025-03-19 11:03:08 +08:00
parent ebe5e2a6bf
commit 8ebb9ec5cd
2 changed files with 34 additions and 6 deletions

37
gin.go
View File

@ -5,6 +5,7 @@
package gin package gin
import ( import (
"context"
"fmt" "fmt"
"html/template" "html/template"
"net" "net"
@ -178,6 +179,7 @@ type Engine struct {
maxSections uint16 maxSections uint16
trustedProxies []string trustedProxies []string
trustedCIDRs []*net.IPNet trustedCIDRs []*net.IPNet
shutdown func(ctx context.Context) error
} }
var _ IRouter = (*Engine)(nil) var _ IRouter = (*Engine)(nil)
@ -524,7 +526,10 @@ func (engine *Engine) Run(addr ...string) (err error) {
engine.updateRouteTrees() engine.updateRouteTrees()
address := resolveAddress(addr) address := resolveAddress(addr)
debugPrint("Listening and serving HTTP on %s\n", address) debugPrint("Listening and serving HTTP on %s\n", address)
err = http.ListenAndServe(address, engine.Handler())
s := &http.Server{Addr: address, Handler: engine.Handler()}
err = s.ListenAndServe()
engine.shutdown = s.Shutdown
return return
} }
@ -540,7 +545,9 @@ func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error) {
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.") "Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
} }
err = http.ListenAndServeTLS(addr, certFile, keyFile, engine.Handler()) s := &http.Server{Addr: addr, Handler: engine.Handler()}
err = s.ListenAndServeTLS(certFile, keyFile)
engine.shutdown = s.Shutdown
return return
} }
@ -563,7 +570,9 @@ func (engine *Engine) RunUnix(file string) (err error) {
defer listener.Close() defer listener.Close()
defer os.Remove(file) defer os.Remove(file)
err = http.Serve(listener, engine.Handler()) s := &http.Server{Handler: engine.Handler()}
err = s.Serve(listener)
engine.shutdown = s.Shutdown
return return
} }
@ -601,7 +610,9 @@ func (engine *Engine) RunQUIC(addr, certFile, keyFile string) (err error) {
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.") "Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
} }
err = http3.ListenAndServeQUIC(addr, certFile, keyFile, engine.Handler()) s := &http3.Server{Addr: addr, Handler: engine.Handler()}
err = s.ListenAndServeTLS(certFile, keyFile)
engine.shutdown = s.Shutdown
return return
} }
@ -616,10 +627,26 @@ func (engine *Engine) RunListener(listener net.Listener) (err error) {
"Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.") "Please check https://github.com/gin-gonic/gin/blob/master/docs/doc.md#dont-trust-all-proxies for details.")
} }
err = http.Serve(listener, engine.Handler()) s := &http.Server{Handler: engine.Handler()}
err = s.Serve(listener)
engine.shutdown = s.Shutdown
return return
} }
// GetShutdown Obtain an gracefully shuts down method.
func (engine *Engine) GetShutdown() func(ctx context.Context) error {
return engine.shutdown
}
// Shutdown gracefully shuts down the server without interrupting any
// active connections.
func (engine *Engine) Shutdown(ctx context.Context) error {
if engine.shutdown != nil {
return engine.shutdown(ctx)
}
return nil
}
// ServeHTTP conforms to the http.Handler interface. // ServeHTTP conforms to the http.Handler interface.
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
c := engine.pool.Get().(*Context) c := engine.pool.Get().(*Context)

3
go.mod
View File

@ -1,6 +1,7 @@
module github.com/gin-gonic/gin module github.com/gin-gonic/gin
go 1.22 go 1.23.0
toolchain go1.23.7 toolchain go1.23.7
require ( require (