Blog
Mert Özen'in yazılım geliştirme, backend, frontend ve DevOps üzerine blog yazıları.
gRPC ve GraphQL'de Sürümlerle Gelenler: .NET Core 3.0'dan .NET 11'e, Hot Chocolate 13'ten 16'ya
Eski bir gRPC ya da GraphQL projesinde ilk bakılacak yerler Grpc.Core kullanımı ve Hot Chocolate'ın ana sürümüdür: Grpc.Core 2021'den beri bakım modunda, Hot Chocolate 16 ise scalar API'sini kökten değiştirdi. grpc-dotnet'in .NET Core 3.0'dan .NET 11'e, Hot Chocolate'ın 13'ten 16'ya getirdiklerini, aynı ISBN scalar'ının iki sürümdeki farkını ve GraphQL spesifikasyonunun September 2025 sürümünü gerçek çıktılarla gösteriyoruz.
REST, gRPC mi GraphQL mi? Aynı Bookstore Senaryosunu Üç Stilde Ölçerek Karar Vermek
Hangi API stilini seçeceğini client türü ve ekranın ihtiyacı belirler: ölçümde küçük service-to-service çağrılarında REST JSON en az server CPU'su harcadı, gRPC ağdaki byte'ı yarıya indirdi, kitap detay ekranında ise tek istekli GraphQL ve gRPC-Web dört istekli REST'i geride bıraktı. k6 ile aynı Bookstore senaryolarını üç stilde ölçüyor, karar boyutlarını ve birlikte kullanımı tartışıyoruz.
Angular'dan GraphQL: Apollo Angular, Code Generation, Subscription'lar ve @defer
Angular'dan GraphQL'e bağlanmanın sağlam yolu Apollo Angular ile normalized cache, GraphQL Code Generator ile typed operation'lar ve aynı codegen'in ürettiği persisted operation manifest'idir. Angular 22 ve Apollo Client 4 ile signal'ler ve dataState'i, mutation sonrası cache tutarlılığını, WebSocket subscription'larını, @defer için gereken fetch tabanlı link'i ve persisted dokümanlarda unutulan __typename'in boş ekranını gerçek çıktılarla gösteriyoruz.
GraphQL'i Güvenli İşletmek: Cost Analysis, Persisted Operation'lar, Authorization ve Schema Evolution
GraphQL'i production'da güvenli işletmek için bilinmeyen sorguyu persisted operation'larla, pahalı sorguyu cost analysis ve derinlik sınırıyla durdurur; yetkiyi field ve kaynak düzeyinde, schema değişikliklerini CI'daki diff ile denetlersin. Hot Chocolate 16'da alias ve variable batching'in maliyeti nasıl çoğalttığını, semantic introspection'ı, hata maskelemeyi, @requiresOptIn'i ve Türkçe bölge ayarında açılmayan cache control'ü gerçek çıktılarla gösteriyoruz.
GraphQL'de Performans: N+1, DataLoader, Batch Resolver ve Cursor Pagination
GraphQL'de N+1'in çözümü, resolver'ların key'lerini toplayıp tek sorguda yükleyen DataLoader'dır; 50 kitabın yazarları 51 SQL sorgusundan 2'ye iner. Hot Chocolate 16'nın DataLoader'larını, batch resolver'ını ve 16.7.5'teki takılmasını, projection'la birlikte kullanmanın sessiz tuzaklarını, offset kılıklı cursor ile gerçek keyset pagination'ı ve OpenTelemetry span'larını gerçek çıktılarla gösteriyoruz.
Hot Chocolate 16 ile Bookstore GraphQL API'si: Schema, EF Core Entegrasyonu ve Mutation'lar
Hot Chocolate 16'da EF Core'u güvenle bağlamanın yolu, her resolver'a pooled factory'den kendi DbContext'ini vermek ve schema'ya açılan her alanı, filtreyi ve hatayı bilinçli seçmektir. Paylaşılan DbContext'in rastgele hatalarını, projection ve sorting'in ürettiği SQL'i, entity'den sızan alış fiyatını, mutation convention'larıyla typed error'ları ve onError'ı gerçek çıktılarla gösteriyoruz.
GraphQL'in Temelleri: Schema, Query, Mutation, Subscription ve Resolver Mantığı
GraphQL'de client ekranın ihtiyacını tek bir query ile tanımlar, server her field'ı kendi resolver'ıyla çözer; bu over-fetching'i bitirir ama N+1'i ve HTTP cache kaybını da beraberinde getirir. Hot Chocolate 16 ile type system'i, variable/fragment/alias'ı, partial data ve null propagation'ı, September 2025 spesifikasyonunun @oneOf'unu ve GraphQL over HTTP davranışını gerçek yanıtlarla gösteriyoruz.
Tarayıcıdan ve REST Client'lardan gRPC: gRPC-Web, JSON Transcoding ve Angular
Tarayıcı trailer'lara erişemediği için gRPC'yi doğrudan konuşamaz; gRPC-Web ile Angular'dan typed client'la, JSON transcoding ile de REST bekleyen client'lara aynı service'i açabilirsin. Connect-ES ve resource API'siyle bir stok rozeti yazıyor; CORS, int64'ün JSON'daki hâli, rich error'larda TypeRegistry tuzağı ve deprecated Grpc.Swagger yerine seçenekleri gerçek çıktılarla gösteriyoruz.
Production'da gRPC: Interceptor, Authentication, Load Balancing, Retry ve Health Check
gRPC'yi production'a taşırken en büyük sürpriz load balancing'dir: HTTP/2 bütün çağrıları tek bağlantıda taşıdığı için L4 balancer ve Kubernetes ClusterIP trafiği tek pod'a yığar; çözüm client-side LB ya da L7 proxy. Interceptor'ları, JWT ve call credentials'ı, retry'ın katmanlarda çarpılmasını, health check ve reflection'ı gerçek ölçümlerle gösteriyoruz.
gRPC Streaming: Server, Client ve Bidirectional Streaming ile Backpressure
gRPC streaming'de yavaş bir consumer'ı HTTP/2 flow control frenler; birden çok abone varsa araya abone başına sınırlı bir Channel koyup yetişemeyeni kapatmak ve sequence numarasıyla kaldığı yerden devam ettirmek gerekir. Stok izleme, CSV'den toplu güncelleme ve kasada barkod okutma örnekleriyle üç streaming türünü, keepalive'ı ve resync'i gerçek çıktılarla gösteriyoruz.
ASP.NET Core'da İlk gRPC Service'i ve Client'ı: Kestrel, Deadline ve RpcException
Bir gRPC çağrısını güvenli yapmak için channel'ı paylaşmak, her çağrıya deadline koymak ve EnableCallContextPropagation ile deadline'ı zincir boyunca taşımak gerekir; yoksa client vazgeçtikten sonra bile downstream service işi bitirip stok ayırır. Inventory'yi Kestrel'de h2c ile ayağa kaldırıyor, status code'ları, rich error model'i ve metadata'yı gerçek loglarla gösteriyoruz.
Protocol Buffers ile Contract Tasarlamak: .proto, Field Number'lar ve Geriye Uyumluluk
gRPC'de contract'ı field adları değil field number'lar taşır; bu yüzden yeni field eklemek güvenli, numarayı ya da tipi değiştirmek sessiz veri bozulmasıdır. Bookstore Inventory'nin inventory.proto'sunu yazıyor; enum'da sıfır kuralını, optional ile presence'ı, para için DecimalValue'yu, reserved'ı ve Grpc.Tools ile C# üretimini gerçek çıktılarla gösteriyoruz.