Skip to content

Instantly share code, notes, and snippets.

@mrizkimaulidan
Created July 3, 2022 08:54
Show Gist options
  • Save mrizkimaulidan/7e5886db288a41e362de53d7a7d2461a to your computer and use it in GitHub Desktop.
Save mrizkimaulidan/7e5886db288a41e362de53d7a7d2461a to your computer and use it in GitHub Desktop.
Graceful shutdown
package main
import (
"context"
"encoding/json"
"log"
"net/http"
"os"
"os/signal"
"syscall"
"time"
)
func index(w http.ResponseWriter, r *http.Request) {
time.Sleep(10 * time.Second)
json.NewEncoder(w).Encode(map[string]any{
"code": http.StatusOK,
"message": "server up",
})
}
func main() {
srv := &http.Server{
Addr: "localhost:3000",
Handler: nil,
}
http.HandleFunc("/", index)
// run server menggunakan goroutine
go func() {
log.Println("server running at", srv.Addr)
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal("error listening", err)
}
}()
// buat channel dan terima sinyal interrupt atau sigterm
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
signal.Notify(c, syscall.SIGTERM)
// masukkin data channel ke variabel sig
// dan close channelnya
sig := <-c
log.Println("got signal", sig)
defer close(c)
// buat context dengan timeout
// 30 detik
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
// proses shutting down server
log.Println("shutting down server..")
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("error shutting down server", err)
}
log.Println("server shutted down successfully")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment