Skip to content

Instantly share code, notes, and snippets.

@kamal-github
Forked from peterhellberg/graceful.go
Created April 1, 2018 18:06
Show Gist options
  • Save kamal-github/95283c75e655cd3d04ffc54a23ee08f2 to your computer and use it in GitHub Desktop.
Save kamal-github/95283c75e655cd3d04ffc54a23ee08f2 to your computer and use it in GitHub Desktop.
*http.Server in Go 1.8 supports graceful shutdown. This is a small example.
package main
import (
"context"
"log"
"net/http"
"os"
"os/signal"
"time"
)
type Server struct {
logger *log.Logger
mux *http.ServeMux
}
func NewServer(options ...func(*Server)) *Server {
s := &Server{
logger: log.New(os.Stdout, "", 0),
mux: http.NewServeMux(),
}
for _, f := range options {
f(s)
}
s.mux.HandleFunc("/", s.index)
return s
}
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.mux.ServeHTTP(w, r)
}
func (s *Server) index(w http.ResponseWriter, r *http.Request) {
s.logger.Println("GET /")
w.Write([]byte("Hello, World!"))
}
func main() {
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt)
logger := log.New(os.Stdout, "", 0)
addr := ":" + os.Getenv("PORT")
if addr == ":" {
addr = ":2017"
}
s := NewServer(func(s *Server) { s.logger = logger })
h := &http.Server{Addr: addr, Handler: s}
go func() {
logger.Printf("Listening on http://0.0.0.0%s\n", addr)
if err := h.ListenAndServe(); err != nil {
logger.Fatal(err)
}
}()
<-stop
logger.Println("\nShutting down the server...")
ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
h.Shutdown(ctx)
logger.Println("Server gracefully stopped")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment