Health check
- Go kursu
- İleri seviye
- Ders 63/68
- 4 dk
/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.
Başlangıç kodu
package main
import (
"fmt"
"net/http"
"net/http/httptest"
"sync/atomic"
)
func main() {
// buraya yaz
}Örnek çözüm
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())
}Beklenen çıktı
503 200
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 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 Doğru cevap
- Daha güvenli olur
- Hiçbir fark olmaz
Açıklama: Yeniden başlatmak veritabanı sorununu çözmez; bağımlılık kontrolleri readiness'e konur, liveness sürecin kendisine bakar.
2 Hizmet dışı kodu
http.Error(w, "hazır değil", http.____)
http.Error(w, "hazır değil", http.StatusServiceUnavailable)
Açıklama: 503 Service Unavailable, servisin şu an trafik almaya hazır olmadığını bildirir.
3 Kontrol ve soru
| Kavram | Anlamı |
|---|---|
/livez |
Süreç yaşıyor mu? |
/readyz |
Trafik alabilir mi? |
503 |
Hazır değil |
atomic.Bool |
Güvenli hazır bayrağı |