Özet - gRPC
- Go kursu
- İleri seviye
- Ders 42/68
- 4 dk
Sunucu ve istemciyi birleştirerek bir gRPC servis yazarsın.
gRPC özeti
Akış: sözleşmeyi .proto'da yaz → protoc ile Go kodu üret → sunucuda arayüzü uygula, Register et, Serve et → istemcide NewClient + üretilmiş istemciyle zaman aşımlı çağrı yap. Hatalar status ve codes ile taşınır.
Alan numaralarını asla değiştirme; silinenleri reserved yap.
Interceptor
gRPC'de middleware'in karşılığı interceptor'dır. Sunucuya grpc.UnaryInterceptor(...) seçeneğiyle eklenir ve her tekli çağrıdan önce/sonra çalışır:
func logla(ctx context.Context, req any, info *grpc.UnaryServerInfo, h grpc.UnaryHandler) (any, error) {
bas := time.Now()
resp, err := h(ctx, req)
log.Println(info.FullMethod, time.Since(bas))
return resp, err
}Uygulama Interceptor benzetimi
type Handler func(string) string tanımla. intercept(h Handler) Handler yaz: çağrıdan önce ">", sonra "<" yazdırsın ve sonucu döndürsün. intercept(func(s string) string { return s + "!" })("go") sonucunu yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
type Handler func(string) string
func intercept(h Handler) Handler {
return func(s string) string {
fmt.Println(">")
r := h(s)
fmt.Println("<")
return r
}
}
func main() {
fmt.Println(intercept(func(s string) string { return s + "!" })("go"))
}Beklenen çıktı
> < go!
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İstemci "kaynak bulunamadı" durumunu nasıl anlar?
- Yanıt boş olunca
- status.Code(err) == codes.NotFound Doğru cevap
- err == nil
- HTTP 404 başlığından
Açıklama: gRPC hata kodları status paketinden okunur; NotFound sunucunun status.Error(codes.NotFound, ...) ile döndürdüğü koddur.
2 Hata kodu
return nil, status.Error(codes.____, "ürün yok")
return nil, status.Error(codes.NotFound, "ürün yok")
Açıklama: codes.NotFound istenen kaydın bulunmadığını bildiren gRPC durum kodudur.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
.proto |
Sözleşme |
protoc |
Kod üretimi |
Interceptor |
gRPC middleware'i |
codes.DeadlineExceeded |
Süre doldu |