Dalam 15 menit ke depan, kita akan merakit sebuah mesin REST API berbasis Go dari nol sampai siap melibas jutaan request tanpa kedip. Bayangkan kita sedang berdiri di dapur sebuah restoran berkapasitas ribuan pesanan per detik; kita butuh kompor yang panas, juru masak yang bergerak paralel tanpa saling tabrak, dan SOP keamanan yang ketat agar tidak ada tamu tak diundang yang masuk ke area dapur.
Mari kita siapkan apron dan mulai meracik arsitektur berperforma tinggi ini.
1. Menu Kita Hari Ini & Alat yang Perlu Disiapkan
Sebelum kita menyalakan terminal, mari pastikan meja kerja kita bersih dari distraksi dan dipersenjatai dengan peralatan tempur yang tepat. Kita tidak akan membuang waktu membahas definisi teoretis yang membosankan. Hari ini, kita akan membangun REST API menggunakan bahasa Go (Golang) karena efisiensi manajemen memori dan model konkurensinya yang legendaris, didukung oleh Redis untuk caching dan rate limiting, dibungkus di belakang Nginx sebagai reverse proxy sekaligus pembatas beban awal, serta diamankan dengan skema token dan header modern.
Pastikan di mesin lokal atau server staging Anda sudah terpasang:
- Go versi 1.21 atau yang lebih baru.
- Redis server untuk menangani counter rate limit.
- Apache Benchmark (ab) atau k6 untuk uji beban (load testing) nanti.
[!IMPORTANT] Jangan gunakan framework web yang terlalu gemuk dan membawa beban abstraksi berlebih. Kita akan memaksimalkan pustaka standar (net/http) Go yang kini sudah sangat bertenaga, dipadu dengan router ringan seperti
chiatauhttprouteruntuk menjaga latensi tetap berada di level mikrodetik.
Dari fondasi perkakas ini, mari kita petakan bagaimana alur data akan mengalir melewati setiap lapisan sistem yang kita bangun.
2. Peta Jalan Singkat: Apa yang Sedang Kita Rakit
Arsitektur yang kita rancang tidak dibuat sembarangan. Kita akan membaginya ke dalam tiga fase eksekusi krusial agar tidak ada komponen yang saling tumpang tindih:
- Fondasi & Environment: Menyiapkan struktur direktori proyek Go yang bersih, menginisialisasi modul, dan menghubungkannya dengan Redis.
- Logika Konkurensi & RESTful: Merancang endpoint yang menerapkan prinsip REST murni, memanfaatkan Goroutine dan Channel untuk memproses tugas latar belakang tanpa memblokir thread utama HTTP.
- Keamanan & Rate Limiting: Memasang perisai di gerbang depan menggunakan algoritma Token Bucket berbasis Redis untuk mencegah serangan DDoS dan brute-force.
Mari kita langsung terjun ke terminal dan mulai mengetik baris kode pertama kita.
3. Langkah 1: Mempersiapkan Fondasi & Environment
Buka terminal Anda, buat direktori baru bernama go-high-perf-api, lalu masuk ke dalam folder tersebut daninisialisasi modul Go:
mkdir go-high-perf-api && cd go-high-perf-api
go mod init github.com/username/go-high-perf-api
Selanjutnya, kita butuh driver Redis untuk menangani manajemen rate limit dan caching data panas. Kita akan menggunakan pustaka go-redis yang terkenal cepat dan andal:
go get github.com/redis/go-redis/v9
go get github.com/go-chi/chi/v5
Sekarang, mari buat struktur file proyek kita agar rapi layaknya arsitektur enterprise:
mkdir -p cmd/api internal/config internal/handler internal/middleware internal/service
touch cmd/api/main.go
Dengan struktur kerangka yang sudah berdiri kokoh ini, kita bisa melangkah ke tahap berikutnya: meracik konfigurasi inti dan server HTTP yang siap melayani jutaan koneksi bersamaan.
4. Langkah 2: Meracik Konfigurasi Inti Tanpa Basa-basi
Mari kita tulis kode utama server kita di cmd/api/main.go. Kita akan mengatur parameter ReadTimeout, WriteTimeout, dan IdleTimeout pada server HTTP Go. Ini adalah langkah krusial untuk mencegah serangan Slowloris di mana koneksi lambat menumpuk dan menghabiskan resource server.
Buka file cmd/api/main.go dan masukkan kode berikut:
package main
import (
"log"
"net/http"
"time"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
)
func main()
// Inisialisasi router Chi yang ringan dan cepat
r := chi.NewRouter()
// Middleware bawaan untuk recovery dari panic dan mencatat request
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
// Timeout global untuk mencegah goroutine leak akibat klien lambat
r.Use(middleware.Timeout(30 * time.Second))
// Endpoint kesehatan (health check) untuk load balancer
r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"status":"UP","[timestamp](/tools/timestamp)":"` + time.Now().Format(time.RFC3339) + `