Skip to content

Instantly share code, notes, and snippets.

@tsyber1an
Forked from kpurdon/main.go
Created October 26, 2021 13:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsyber1an/32523c0247c1f65b0481d0a2155e645e to your computer and use it in GitHub Desktop.
Save tsyber1an/32523c0247c1f65b0481d0a2155e645e to your computer and use it in GitHub Desktop.
golang graceful server shutdown example
package main
import (
"context"
"flag"
"fmt"
"log"
"net/http"
"os"
"os/signal"
"time"
)
const (
service = "fooapi"
)
var (
port = flag.Int("port", 3333, "http port to listen on")
shutdownTimeout = flag.Duration("shutdown-timeout", 10*time.Second,
"shutdown timeout (5s,5m,5h) before connections are cancelled")
)
func main() {
flag.Parse()
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
})
srv := &http.Server{
Addr: fmt.Sprintf(":%d", *port),
Handler: mux,
}
stop := make(chan os.Signal)
signal.Notify(stop, os.Interrupt)
go func() {
log.Printf("%s listening on 0.0.0.0:%d with %v timeout", service, *port, *shutdownTimeout)
if err := srv.ListenAndServe(); err != nil {
if err != http.ErrServerClosed {
log.Fatal(err)
}
}
}()
<-stop
log.Printf("%s shutting down ...\n", service)
ctx, cancel := context.WithTimeout(context.Background(), *shutdownTimeout)
defer cancel()
if err := srv.Shutdown(ctx); err != nil {
log.Fatal(err)
}
log.Printf("%s down\n", service)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment