Skip to content

HTTP, REST, gRPC Protokolleri

Protokol seçimi, istemcinin yetenekleri ile sistemin performans, sözleşme ve operasyon ihtiyaçlarını eşleştirir. Protokol değişimi mimariyi sadeleştirmiyorsa, var olan protokolü iyi tasarlamak genellikle daha ucuzdur.

Hızlı Karar

İhtiyaçTercihDikkat
Public web/mobile APIHTTP/RESTHata modeli ve versiyonlama tutarlı olmalı
İç servisler arası düşük gecikmegRPCProtobuf sözleşmesi ve tooling gerekir
Gerçek zamanlı çift yönlü kanalWebSocketBağlantı yönetimi ve ölçekleme zorlaşır
Tek yönlü canlı güncellemeServer-Sent EventsBasit ama her senaryoya uymaz

Üretim Kontrol Listesi

  • Problem: Protokol hangi darboğazı çözüyor: latency, payload, streaming, sözleşme veya istemci çeşitliliği?
  • Çözüm: Timeout, retry, idempotency, auth ve observability standardı protokol bazında tanımlı mı?
  • Trade-off: REST debug kolaylığı sağlar; gRPC performans sağlar; WebSocket durum yönetimi ekler.
  • Hata durumu: Deadline exceeded, connection reset, partial response ve retry storm senaryoları ele alınmalı.
  • Ölçüm: Payload size, round-trip count, connection count, p95 latency ve error code dağılımı izlenmeli.
  • Güvenlik/maliyet: TLS, mTLS, schema doğrulama ve rate limit gereksinimleri protokole göre değişir.

Protokol Etkileşimi

REST API Yaşam Döngüsü

gRPC Akış Tipleri

Spring Boot ile REST API Geliştirme

Spring WebMVC

  • Geleneksel servlet tabanlı yaklaşım
  • Bloklanabilir I/O modeli
  • Yaygın olarak benimsenmiş ve olgun

Spring WebFlux

  • Reaktif programlama modeli
  • Bloklanmayan I/O
  • Mono/Flux türleri ile eşzamansız akışlar

İçerik Müzakeresi

  • @RequestMapping(produces/consumes) ile MediaType işleme
  • JSON/XML/Protocol Buffers desteği

Doğrulama

  • Bean Validation (@Valid, @NotNull, @Size) ile istek doğrulama
  • MethodValidationInterceptor ile metod seviyesi doğrulama

Hata İşleme

  • @ControllerAdvice ile global istisna işleme
  • ResponseEntity ile özel HTTP durum kodları

REST API En İyi Uygulamalar (Spring Boot ile)

Richardson Olgunluk Modeli

  • Seviye 0: HTTP taşıma olarak
  • Seviye 1: Kaynaklar
  • Seviye 2: HTTP Fiilleri
  • Seviye 3: HATEOAS desteği için Spring HATEOAS kütüphanesi

Sürümleme Stratejileri

  • URL sürümlemesi (/api/v1/)
  • Başlık tabanlı sürümleme
  • İçerik müzakeresi

Dokümantasyon

  • SpringDoc OpenAPI (Swagger) ile otomatik API dokümantasyonu
  • @Operation ve @Schema açıklamaları

Güvenlik

  • Spring Security ile JWT token doğrulama
  • OAuth2 Resource Server yapılandırması

gRPC Entegrasyonu (Spring Boot ile)

gRPC Başlatıcıları

  • spring-boot-starter-grpc-server/client bağımlılıkları

Protobuf Kod Üretimi

  • protobuf-maven-plugin ile Java sınıf üretimi

Servis Uygulaması

  • @GrpcService açıklaması ile servis uygulaması
  • Bloklanabilir/bloklanmayan taslaklar

Kesiciler

  • gRPC kesicileri ile kimlik doğrulama, günlükleme, metrik toplama

Performans Faydaları

  • İkili serileştirme ile %30-50 daha az bant genişliği
  • HTTP/2 çoklama
  • Çift yönlü akış

Protokol Seçim Kriterleri

REST

  • ✅ Genel API'ler
  • ✅ Tarayıcı tabanlı istemciler
  • ✅ İnsan tarafından okunabilir gereksinimler
  • ✅ Önbellek desteği
  • ❌ Yüksek performans senaryoları

gRPC

  • ✅ Yüksek performanslı dahili servisler
  • ✅ Çok dilli mikroservisler
  • ✅ Gerçek zamanlı akış gereksinimleri
  • ✅ Tür güvenliği
  • ❌ Tarayıcı desteği

GraphQL

  • ✅ Karmaşık sorgu gereksinimleri
  • ✅ Mobil istemciler ile bant genişliği optimizasyonu
  • ✅ Ön uç odaklı geliştirme
  • ❌ Önbellek karmaşıklığı

GraphQL Entegrasyonu

Spring GraphQL

  • Şema öncelikli yaklaşım
  • Tür tanımları

DataFetcher

  • Özel çözümleyici uygulamaları
  • N+1 problem çözümü

Toplu İşleme ve Önbellek

  • DataLoader deseni
  • Alan seviyesi önbellekleme

Güvenlik

  • Alan seviyesi yetkilendirme
  • Derinlik sınırlama

Performans İzleme

  • Sorgu karmaşıklığı analizi
  • Yürütme süresi takibi

WebSocket ve Sunucu Gönderilen Olaylar

Spring WebSocket

  • STOMP protokolü
  • Mesaj aracısı entegrasyonu

Gerçek Zamanlı Güncellemeler

  • Yayın/abone deseni
  • Konu tabanlı mesajlaşma

Bağlantı Yönetimi

  • Kalp atışı mekanizması
  • Yeniden bağlanma stratejisi

Ölçeklenebilirlik

  • WebSocket kümeleme
  • Yapışkan oturumlar

Güvenlik

  • CSRF koruması
  • Kaynak doğrulama

Protokol Karşılaştırması

ÖzellikRESTgRPCGraphQL
PerformansOrtaYüksekOrta
Tarayıcı Desteği
Akış
Tür Güvenliği
ÖnbelleklemeKarmaşık
Öğrenme EğrisiDüşükOrtaYüksek

Uygulama Örnekleri

REST Uç Noktası

java
@RestController
@RequestMapping("/api/v1/users")
public class UserController {
    
    @GetMapping("/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findById(id);
        return ResponseEntity.ok(user);
    }
    
    @PostMapping
    public ResponseEntity<User> createUser(@Valid @RequestBody CreateUserRequest request) {
        User user = userService.create(request);
        return ResponseEntity.status(CREATED).body(user);
    }
}

gRPC Servisi

java
@GrpcService
public class UserGrpcService extends UserServiceGrpc.UserServiceImplBase {
    
    @Override
    public void getUser(GetUserRequest request, StreamObserver<UserResponse> responseObserver) {
        User user = userService.findById(request.getId());
        UserResponse response = UserResponse.newBuilder()
            .setUser(convertToProto(user))
            .build();
        
        responseObserver.onNext(response);
        responseObserver.onCompleted();
    }
}

Performans Optimizasyonu

REST API Optimizasyonu

  • HTTP/2 desteği
  • Yanıt sıkıştırma
  • ETag önbellekleme
  • Sayfalama
  • Alan seçimi

gRPC Optimizasyonu

  • Bağlantı havuzu
  • Büyük veri kümeleri için akış
  • Sıkıştırma algoritmaları
  • Canlı tutma ayarları

Ortak Optimizasyonlar

  • İstek toplu işleme
  • Bağlantı yeniden kullanımı
  • Devre kesici deseni
  • Yük dengeleme
  • Sağlık kontrolleri

GraphQL Sorgu Akışı

WebSocket Bağlantı Yaşam Döngüsü

Performans Optimizasyonu Akışı

Eren Demir tarafından oluşturulmuştur.