Kenapa Go untuk microservice
Go punya binary hasil compile yang kecil, startup cepat, dan concurrency model (goroutine, channel) yang ringan. Cocok untuk microservice yang perlu footprint kecil dan performa konsisten.
HTTP handler minimal
func healthHandler(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK)
w.Write([]byte("ok"))
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/health", healthHandler)
srv := &http.Server{Addr: ":8080", Handler: mux}
log.Fatal(srv.ListenAndServe())
}
Tidak perlu framework besar untuk kasus sederhana, standard library net/http sudah cukup untuk banyak microservice.
Graceful shutdown
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()
go func() {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal(err)
}
}()
<-ctx.Done()
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(shutdownCtx)
Graceful shutdown penting di lingkungan container/orchestrator seperti Kubernetes, supaya request yang sedang berjalan tidak terputus paksa saat pod di-terminate.
Kapan Go, kapan Node/NestJS
Go unggul di beban kerja CPU-bound dan concurrency tinggi dengan resource terbatas. Untuk tim yang sudah kuat di ekosistem JavaScript/TypeScript dan butuh kecepatan development lebih dari raw performance, Node atau NestJS tetap pilihan yang wajar.