Go
Health check
/healthz gibi sağlık üç noktası yazmayı öğrenirsin.
Sağlık kontrolü
Orkestratörler iki soru sorar: liveness — süreç yaşıyor mu? (yanıt yoksa yeniden başlat) ve readiness — trafik almaya hazır mı? (veritabanı bağlı mı, ısınma bitti mi?).
mux.HandleFunc("GET /livez", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("ok"))
})
mux.HandleFunc("GET /readyz", func(w http.ResponseWriter, r *http.Request) {
if err := db.PingContext(r.Context()); err != nil {
http.Error(w, "db yok", http.StatusServiceUnavailable)
return
}
w.Write([]byte("ok"))
})
Kapanırken hazır değil
Nazik kapanış sırasında servis önce readiness'i "hazır değil"e çevirir, yük dengeleyicinin trafiği kesmesini bekler, sonra açık istekleri bitirip kapanır. Bunun için atomik bir bayrak yeterlidir:
var hazir atomic.Bool
hazir.Store(true)
// SIGTERM gelince
hazir.Store(false)
time.Sleep(5 * time.Second)
srv.Shutdown(ctx)
Uygulama Readiness uç noktası
var hazir atomic.Bool tanımla. /readyz işleyicisi bayrak false ise 503, true ise 200 döndürsün. Bayrak false iken ve true yapıldıktan sonra iki istek gönderip iki kodu tek satırda yazdır.
Örnek çözümü göster
package main
import (
"fmt"
"net/http"
"net/http/httptest"
"sync/atomic"
)
var hazir atomic.Bool
func readyz(w http.ResponseWriter, r *http.Request) {
if !hazir.Load() {
http.Error(w, "hazır değil", http.StatusServiceUnavailable)
return
}
w.Write([]byte("ok"))
}
func istek() int {
rec := httptest.NewRecorder()
readyz(rec, httptest.NewRequest("GET", "/readyz", nil))
return rec.Code
}
func main() {
once := istek()
hazir.Store(true)
fmt.Println(once, istek())
}
Kendini test et
-
Liveness kontrolü veritabanını da denetlerse ne olabilir?
- Uygulama hızlanır
- Veritabanı kısa süre kesilince tüm podlar boşuna yeniden başlar
- Daha güvenli olur
- Hiçbir fark olmaz
Cevabı göster
Veritabanı kısa süre kesilince tüm podlar boşuna yeniden başlar — Yeniden başlatmak veritabanı sorununu çözmez; bağımlılık kontrolleri readiness'e konur, liveness sürecin kendisine bakar.
-
Hizmet dışı kodu
http.Error(w, "hazır değil", http.____)
Cevabı göster
http.Error(w, "hazır değil", http.StatusServiceUnavailable)
-
Kontrol ve soru
- /livez
- Süreç yaşıyor mu?
- /readyz
- Trafik alabilir mi?
- 503
- Hazır değil
- atomic.Bool
- Güvenli hazır bayrağı
Sıradaki ders: Özet - Observability