JAVA MICROSERVICE NEDİR?

Spring leaf logosu çevresinde dizilmiş Java mikroservis kümesi ve servis mesh bağlantıları

Cuma akşamı 22:00, deploy hâlâ sürüyor. Dört saat önce başlayan paketleme bitmek bilmiyor, üstüne bir ödeme modülündeki null pointer hatası tüm sistemi yere serdi — sepet, ürün listesi, kullanıcı girişi dahil her şey kapandı. Tek bir satır kod yüzünden 80 kişilik şirketin tüm uygulaması ölü. Bu tabloyu yaşayan ekiplerin çoğu, çözümü mikroservis mimarisinde arıyor. Peki bu yapı gerçekten ne vaat ediyor ve Spring Boot ile nasıl hayata geçirilir?

Monolith Neden Tıkanır?

Monolitik uygulama, tüm iş mantığının tek bir kod tabanında ve tek bir deploy biriminde toplanmasıdır. Başlangıçta hızlıdır; tek IDE, tek build, tek veritabanı. Ancak ekip büyüdükçe ve modül sayısı arttıkça birkaç sorun aynı anda baş gösterir: Konuya ilişkin kapsamlı dokümanları ek bir başvuru kaynağı olarak değerlendirilebilir.

  • Küçük bir değişiklik için bile tüm uygulamayı yeniden derlemek ve dağıtmak gerekir.
  • Bir modülün belleği şişirmesi, ilgisiz modüllerin de çökmesine yol açar.
  • Farklı ekipler aynı kod tabanında çakışır; pull request'ler haftalarca bekler.
  • Ölçeklenmek istenen tek bir bileşen için tüm uygulamanın kopyası açılmak zorunda kalınır.

4 saatlik deploy süresi semboliktir — asıl maliyet, ekibin yeni özelliğe başlamak yerine release korkusuyla kilitlenmesidir.

Mikroservis Mimarisi Tam Olarak Nedir?

Mikroservis, uygulamayı iş yetkinliklerine göre bölünmüş, bağımsız çalışan ve birbirleriyle ağ üzerinden konuşan küçük servisler bütünü olarak tasarlamaktır. Her servisin kendi kod tabanı, kendi veritabanı ve kendi deploy hattı vardır.

Bir e-ticaret örneğinde monolith şöyle parçalanır: Katalog Servisi, Sepet Servisi, Ödeme Servisi, Bildirim Servisi, Kullanıcı Servisi. Ödeme modülündeki bir hata artık katalog görüntülenmesini etkilemez; sepet hâlâ çalışır, kullanıcı hâlâ giriş yapabilir.

Monolitik blok ile parçalanmış Spring tabanlı mikroservis tile grid yan yana karşılaştırması

Spring Boot ile Bölme Akışı

Java ekosisteminde mikroservis kurmanın yolu pratik olarak Spring Boot üzerinden geçer. Tek bir main sınıfı, gömülü Tomcat ve auto-configuration sayesinde her servis bağımsız bir JAR olarak ayağa kalkar. Bölme süreci kabaca şu sırayla ilerler:

  1. Bounded Context Tespiti: Domain-Driven Design yaklaşımıyla iş alanlarını çıkarın. "Kullanıcı" kelimesi sepette farklı, faturalamada farklı anlam taşıyor olabilir.
  2. İlk Servisi Ayırma: En az bağımlı modülü seçin (genelde Bildirim veya Raporlama). Spring Boot ile yeni bir spring-boot-starter-web projesi açın, REST endpoint'leri tanımlayın.
  3. Veritabanı Ayrıştırma: Servis kendi şemasına sahip olmalı. Aynı tabloyu iki servisin yazması yasaktır — bu monolith'in dağıtık versiyonunu doğurur.
  4. İletişim Katmanı: Senkron ihtiyaçlar için RestTemplate ya da WebClient, asenkron olaylar için Kafka veya RabbitMQ kullanın.
  5. Service Discovery & Gateway: Spring Cloud Eureka ile servisler birbirini bulur, Spring Cloud Gateway dış dünyaya tek bir kapı açar.
  6. Resilience: Resilience4j ile circuit breaker pattern uygulayın; bir servis düşse bile çağıran servis fallback ile ayakta kalır.

Bu mimariyi uçtan uca pratikle öğrenmek isteyenler Java mikroservis eğitimi içeriğinden yararlanabilirsiniz.

Deploy Süresi Neden 4 Saatten 4 Dakikaya İner?

Mikroservislerde her servis bağımsız bir CI/CD hattına sahiptir. Bildirim servisinde yapılan bir değişiklik, sadece o servisin Docker imajını yeniden inşa eder ve Kubernetes üzerinde sadece o pod'lar güncellenir. Toplam paketleme süresi tek bir servisin build süresiyle sınırlı kalır — tipik olarak 3-5 dakika.

Üstelik rolling update ya da canary deployment stratejileriyle yeni sürüm önce trafiğin %5'ine açılır; sorun varsa rollback saniyeler içinde yapılır. Monolith'te ise her release'in arkasında onlarca modülün regresyon riski vardır.

İzolasyon: Tek Bug Artık Tüm Sistemi Düşürmez

Klasik monolith'te bellek sızıntısı yaşayan bir modül, JVM'i komple tükettiğinde uygulamadaki her şey ölür. Mikroservis dünyasında her servis kendi process'inde, kendi container'ında, çoğu zaman kendi node'unda çalışır. Bir servisin OOM olması:

  • Sadece o servisi etkiler, diğer servisler trafik almaya devam eder.
  • Kubernetes liveness probe ile otomatik yeniden başlatılır.
  • Circuit breaker sayesinde çağıranlar timeout'a takılmaz, fallback değer döner.

Bu izolasyon, "Cuma 22:00 alarmı" kültürünü ortadan kaldıran ana faktördür.

Mikroservis Her Derde Deva Değil

Bölme her zaman doğru karar değildir. 5 geliştiricilik bir ekip için 20 servislik mimari kurmak, sorunu çözmek yerine işletim yükünü katlar. Mikroservise geçmeden önce şu sorulara dürüst cevap vermek gerekir:

  • Deploy frekansı ve modül bağımsızlığı bunu gerektirecek kadar yüksek mi?
  • Distributed tracing, log aggregation, container orchestration için ekipte yetkinlik var mı?
  • Network latency ve eventual consistency ile yaşamaya hazır mısınız?

Spring Boot ile mikroservis eğitim içeriklerini buradan inceleyebilirsiniz; Eureka, Gateway, Config Server ve Resilience4j konuları örneklerle ele alınır.

Spring Cloud Gateway, Eureka servis kaydı ve mikroservis pod kümesi mimari diyagramı

Geçişe Nereden Başlamalı?

"Hemen tüm monolith'i parçalayalım" yaklaşımı çoğu projede başarısız olur. Sağlıklı yol Strangler Fig Pattern'dir: monolith'in önüne bir API Gateway koyup, yeni özellikleri yan mikroservis olarak yazmak ve eski endpoint'leri zaman içinde dışarı taşımaktır. Bu yöntemle hem üretim aksamaz hem de ekip mikroservis kasını organik şekilde geliştirir. İlk servis ayrıldığında 4 saatlik deploy'un yerine 4 dakikalık bağımsız release'in geldiğini görmek, geri kalan dönüşümün en güçlü motivasyonudur.