Skip to content

Graceful Shutdown

package main
import (
"context"
"errors"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"github.com/0mjs/zinc"
)
func main() {
app := zinc.New()
app.Get("/health", func(c *zinc.Context) error {
return c.String("ok")
})
go func() {
if err := app.Listen(":8080"); err != nil && !errors.Is(err, http.ErrServerClosed) {
log.Printf("server: %v", err)
}
}()
signals, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
<-signals.Done()
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
if err := app.Shutdown(ctx); err != nil {
log.Fatal(err)
}
}

Readiness checks should fail before shutdown begins so a load balancer stops sending new traffic.