CodeBlanks Logo Icon CodeBlanks

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

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
    "sync/atomic"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
http.Error(w, "hazır değil", http.____)
Cevap
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ğı

İleri seviye bölümündeki tüm dersler