Konfigurasi & Menjalankan Server dengan Aman
Membaca port dari environment variable, memasang timeout pada http.Server, dan memahami graceful shutdown.
Dari ListenAndServe ke http.Server
Di bab 2 kita memakai http.ListenAndServe(":8080", mux). Itu praktis, tetapi tidak punya batas waktu: client yang lambat atau nakal bisa menahan koneksi selamanya. Untuk server yang serius, buat http.Server sendiri:
srv := &http.Server{
Addr: ":8080",
Handler: handler,
ReadTimeout: 5 * time.Second, // batas membaca request
WriteTimeout: 10 * time.Second, // batas menulis response
}
log.Fatal(srv.ListenAndServe())
5 * time.Second adalah tipe time.Duration. Hasil cetaknya berbentuk 5s.
Konfigurasi lewat environment variable
Port, kunci rahasia, dan alamat database tidak boleh ditulis keras di kode, karena berbeda di tiap lingkungan (laptop, server, cloud). Baca dari environment variable:
port := os.Getenv("PORT") // "" bila tidak diatur
if port == "" {
port = "8080" // nilai bawaan
}
Menjalankannya: PORT=9000 go run .
Graceful shutdown (bacaan lanjutan)
Saat server dimatikan (Ctrl+C atau deploy ulang), request yang sedang diproses sebaiknya diselesaikan dulu. Polanya:
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
go func() { srv.ListenAndServe() }()
<-ctx.Done() // tunggu Ctrl+C
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
srv.Shutdown(shutdownCtx) // selesaikan request berjalan
Bagian ini hanya untuk dibaca dan dicoba di komputermu; latihan di bawah fokus pada konfigurasi dan timeout.