Giriş

Son yıllarda herkesin dilinde aynı kelime: microservices. “Bağımsız servisler”, “ölçeklenebilirlik”, “dayanıklılık”… kulağa harika geliyor. Ama iş pratiğe geldiğinde tablo bambaşka.

microservices

Bu yazıda “microservice nedir” anlatmayacağım. Onu zaten bin yerde bulursun. Bunun yerine, .NET dünyasında microservice mimarisiyle uğraşırken karşına çıkacak gerçekleri ve bu yolda edindiğim deneyimleri paylaşacağım.

1. Her Şey Güzel Başlar… Sonra Log Aramaya Başlarsın

İlk servis yazılır, Swagger açılır, Docker container’ı ayağa kalkar… Herkes “microservice mimarisine geçtik!” diye sevinir.
Sonra biri sorar:

“PaymentService neden OrderService’ten yanıt bekliyor?”

İşte o an, monolit günlerine özlem başlar. Çünkü mikroservis, seni bağımsızlaştırırken bağımlılıklarını görünür hale getirir.

Gerçek dünya projelerinde her şey “dağıtılmış”tır:

  • Servisler farklı portlarda,
  • Loglar farklı dosyalarda,
  • Hatalar farklı yerlerde…

İlk ders: görünürlük (observability) yoksa, mimari değil kaos vardır.

2. REST mi gRPC mi Event mi? Cevap: Evet, Hepsi

Bir ekip der ki “tamamen event-driven olacağız”. Üç sprint sonra başka biri der ki “şuraya hızlı bir REST çağrısı atalım.” Gerçek dünyada kimse %100 event-driven değildir. Ama önemli olan şudur: hangi senaryoda hangi iletişim tipini kullanacağını bilmek.

.NET tarafında seçenek bol:

  • REST (Minimal API): Basit CRUD servisleri için.
  • gRPC: Düşük gecikmeli sistemlerde.
  • Event-driven: Servisleri tamamen bağımsız hale getirmek için.

İpucu: “OrderCreated” event’i, “StockService” ve “NotificationService” tarafından dinlendiğinde, senkron bağımlılıklar ortadan kalkar.

Ama unutma: Üç farklı iletişim modelini aynı sistemde kullanıyorsan, debug ekranı Matrix’e döner.

3. Event Bus: Gerçek Bağımsızlığın Başlangıcı

Microservices mimarisinde event bus, bağımsızlığın omurgasıdır. .NET ekosisteminde en çok tercih edilenler:

  • RabbitMQ
  • Kafka
  • Azure Service Bus

Bunları sarmalayan MassTransit veya CAP kütüphaneleri, publish / subscribe süreçlerini basitleştirir. Ama event bus sadece bir teknoloji değil, “senkron düşünme alışkanlığını” kıran bir zihniyet değişimidir.

İzlenebilirlik: Hata Yoksa Panik

Bir request UserService → OrderService → PaymentService zincirinde kaybolduysa
ve sadece şu log varsa:

“Timeout.”
işte o zaman OpenTelemetry hayat kurtarır.

OpenTelemetry, Grafana, Kibana, Jaeger gibi araçlarla “request’in nereye kadar geldiğini” görebilirsin. Bu araçlar olmadan, dağıtık sistem değil, dağılmış sistem yönetmiş olursun.

5. Versiyonlama: Küçük Değişiklik, Büyük Etki

Gerçek dünyada API’ler sürekli evrilir. Ama bir endpoint değişince tüm sistem kırılıyorsa, ortada mikroservis değil domino taşı vardır.

.NET tarafında:

  • API Versioning
  • Backward Compatibility
  • OpenAPI (Swagger) Contract-first
    yaklaşımlarıyla bu süreci yönetmek mümkün.

Küçük not: Event mesajlarını Avro veya Protobuf formatında tip güvenli saklamak uzun vadede büyük avantaj sağlar.

6. Deployment: Her Servis Kendi Hızında

Microservice mimarisi kod değil, dağıtım kültürüdür. Eğer CI/CD pipeline’ların bağımsız değilse, “tek bir servisi deploy edelim” dediğinde 8 tanesi daha build oluyorsa, hala monolith’in farklı bir formundasın.

Doğru yapı:

  • Docker + Kubernetes
  • CI/CD + Feature Flags
  • Helm Charts veya Azure DevOps Templates

Böylece her servis, diğerlerinden bağımsız şekilde evrimleşebilir.

7. Kültür Olmadan Mimari Olmaz

Microservice bir “pattern” değil, bir takım disiplinidir. Küçük, otonom ekipler olmadan bu yapı uzun vadede çöker. Kodun sağlam olması kadar, takımın test, versiyonlama ve izleme alışkanlıkları da bu oyunun parçasıdır.

“Microservice mimarisi, ekipleri birbirine bağlayan gevşek ama sağlam ipler gibidir.”

Gerçek Senaryo

Bir üretim projesinde OrderService çöktüğünde tüm süreç duruyordu. Event-driven yapıya geçip “Retry + Dead Letter Queue” eklendiğinde uptime oranı %99,9’a çıktı. Sorun kodda değil, yaklaşımdaymış.

Sonuç

Microservices hâlâ büyüleyici bir fikir. Ama gerçekte, .NET geliştiricileri için bu fikir: dockerfile’lar, event bus’lar, loglar ve kültür arasında olgunlaşır.

Son söz:

“Bağımsız servisler yazmak kolay, ama gerçekten bağımsız düşünen ekipler kurmak zordur.”

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir