.NET MICROSERVICES NEDİR?

Pazartesi sabahı: ürün yöneticisi ödeme akışındaki tek bir validasyon kuralının değişmesini istiyor. Kodu yazıyorsun, branch'i merge ediyorsun ve test ortamı ayağa kalkana kadar 40 dakika bekliyorsun — çünkü monolit uygulamanın tamamı yeniden derleniyor. Üretime çıkışta tüm sistem yeniden başlıyor; sepet, kullanıcı, fatura modülleri dahil. Üstelik bunun için gece yarısı bakım penceresi açmak gerekiyor. Microservices mimarisi tam olarak bu acıyı azaltmak için doğdu: küçük, bağımsız çalışan, ayrı ayrı dağıtılabilen servisler.
.NET ekosistemi 2016'daki ASP.NET Core dönüşümünden sonra mikroservis kurmak için olgun bir araç setine kavuştu — Web API, minimal API, gRPC, message broker entegrasyonları, container desteği platform içinde birinci sınıf yurttaş. Bu yazı .NET'le mikroservis kuracak veya mevcut sistemini bu yöne taşıyacak geliştiricilere genel bir harita çıkarır: mimarinin temel bileşenleri neler, .NET hangi araçları sunar, hangi durumlarda alternatif yaklaşımlar daha mantıklıdır.
1. Microservices Mimarisinin Özü
Microservices, tek bir büyük uygulamayı (monolit) iş yetenekleri etrafında bağımsız servislere bölme yaklaşımıdır. Her servisin kendi kod tabanı, kendi veritabanı, kendi deployment hattı vardır. Servisler birbirleriyle ağ üzerinden — HTTP, gRPC veya mesaj kuyruğuyla — konuşur.
Tanımı kısa ama içerdiği maliyet kısa değil. Tek process içinde yapılan basit bir method çağrısı artık ağ çağrısı; bellekteki tek transaction artık birden fazla servisi etkileyen distributed transaction; tek log dosyası artık merkezi log toplama altyapısı gerektiren onlarca akış. Bu nedenle microservices, popüler bir tasarım kararı olmaktan önce bir ölçek ve organizasyon kararıdır.
Bir mikroservisin sınırını çekerken kullanılan en yaygın rehber Domain-Driven Design'ın bounded context kavramıdır: "fatura", "ödeme", "katalog", "sevkiyat" gibi iş yetenekleri ayrı servisler olur. Servis sınırı bir iş kavramının içeriği değişmeden anlamlı kalabildiği bölgedir.
2. .NET Ekosisteminin Mikroservis Araç Seti
.NET 8 ve sonrasında, mikroservis kurmak için ihtiyaç duyulan parçaların büyük bölümü framework ile birlikte gelir. Microsoft'un yayımladığı resmi .NET mikroservis mimari kılavuzu, referans uygulamayla beraber temel desenleri detaylı şekilde belgeler. Kısa bir liste:
- ASP.NET Core Web API — RESTful HTTP servisleri için. JSON serileştirme, routing, model validation hazır gelir.
- Minimal API — Controller ihtiyacı olmayan küçük servislerde dosya başına 30-50 satırla çalışan bir HTTP servis kurabilirsiniz.
- gRPC — İçeride servisler arası yüksek performans iletişimi için. Protobuf tabanlı, JSON'a göre 3-5 kat hızlı.
- YARP — Microsoft'un kendi reverse proxy kütüphanesi. Custom API gateway veya BFF (Backend for Frontend) yazmak için kullanılır.
- MassTransit / NServiceBus — RabbitMQ, Azure Service Bus, Kafka üzerinde mesajlaşma soyutlaması.
- Polly — Retry, circuit breaker, timeout gibi resilience desenleri için standart kütüphane.
- OpenTelemetry — Distributed tracing ve metrik toplama; mikroservislerde kritik.
- .NET Aspire — .NET 8 ile gelen, çoklu servisleri lokal geliştirme ortamında orkestre eden yeni stack.
Bu listenin tek başına bir mikroservis sistemi kurmadığını hatırlatmak lazım. Liste sadece tuğlalardır; mimari tasarımı geliştirici yapar.

3. Tipik Bir .NET Mikroservisi Anatomisi
Minimal API ile yazılmış bir sipariş mikroservisi şu kadar yer kaplar:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<OrderContext>(opt =>
opt.UseNpgsql(builder.Configuration.GetConnectionString("Orders")));
builder.Services.AddScoped<IOrderRepository, OrderRepository>();
builder.Services.AddOpenTelemetry().WithTracing(t => t.AddAspNetCoreInstrumentation());
var app = builder.Build();
app.MapGet("/orders/{id:int}", async (int id, IOrderRepository repo) =>
{
var order = await repo.GetAsync(id);
return order is null ? Results.NotFound() : Results.Ok(order);
});
app.MapPost("/orders", async (CreateOrderDto dto, IOrderRepository repo) =>
{
var order = await repo.CreateAsync(dto);
return Results.Created($"/orders/{order.Id}", order);
});
app.Run();Bu kadar. Tek dosya, tek process, tek veritabanı. Production'da bunun yanına Dockerfile, appsettings.json, health check endpoint ve birim testleri eklenir. 200 satırı geçmeyen bir bağımsız servis ortaya çıkar — ki bu mikroservis felsefesinin tipik boyutudur.
4. Servisler Arası İletişim Modelleri
İki tür iletişim vardır: senkron (request-response) ve asenkron (message-based). İkisinin doğru yerde kullanılması mimarinin sağlığını belirler.
Senkron iletişim — HTTP ve gRPC
Çağıran servis cevabı beklerken hatta tutulur. UI tarafının bilgi sorgulaması, doğrulama gerektiren çağrılar genelde senkron yürür. HTTP/JSON dış istemciler ve dış API'lar için; gRPC iç servisler arası performans önemli yerlerde kullanılır. Senkron çağrı zincirleri uzadıkça gecikme katlanarak büyür, bu nedenle 4-5 servisi peşpeşe çağıran "senkron zincir" anti-pattern sayılır.
Asenkron iletişim — mesajlaşma
Çağıran taraf mesajı kuyruğa koyar ve devam eder. "Sipariş oluşturuldu" eventi yayınlanır; stok servisi, fatura servisi ve mail servisi bunu kendi temposunda dinler. Bu yaklaşım servisleri birbirinden gevşek bağlar; bir servis ölü olsa bile mesaj kuyruğunda birikir, geri geldiğinde işler. .NET tarafında MassTransit, kuyruk teknolojisini soyutlayarak RabbitMQ veya Azure Service Bus arasında geçişi pratikleştirir.
Kural: komut (yapılması gereken iş) senkron olabilir; event (olmuş bir gerçek) neredeyse her zaman asenkron yayınlanır.
5. Container ve Orkestrasyon
Mikroservisler container içinde yaşar. Bunun teknik nedeni izolasyondur; sosyal nedeni ise her servisin kendi runtime, kütüphane ve config bağımlılığını taşıyabilmesidir. .NET tarafında Docker resmi olarak desteklenir; dotnet publish komutu /p:PublishProfile=DefaultContainer bayrağıyla Dockerfile yazmadan container image üretir.
5-10 servisten fazlaya çıkıldığında container'ları elle yönetmek mümkün değil. Bu noktada Kubernetes devreye girer: hangi servisten kaç kopya çalışacak, hangisi hangisinden sonra ayağa kalkacak, biri çökerse ne olacak — hepsi declaratif manifest dosyalarıyla tanımlanır. Kubernetes ile çalışmayı yapılandırılmış biçimde ele almak isteyenler Kubernetes eğitimi'nden faydalanabilir.

Lokal geliştirmede her seferinde 8 container ayağa kaldırmak yorucu bir iştir. .NET 8 ile gelen .NET Aspire bu sorunu hedef alır: tek bir AppHost projesinden Redis, Postgres, RabbitMQ ve birden fazla servisi tek komutla ayağa kaldırır, dashboard üzerinden takip eder. Yeni bir proje tipi değil — geliştirici deneyimini düzelten bir orkestrasyon katmanı.
6. Microservices Her Probleme Cevap Değil
Mikroservis mimarisi 5 kişilik bir ekibin 3 aylık MVP'sinde uygulanırsa, mimari kazanç değil ek yük getirir. Martin Fowler bu durumu "monolith first" ilkesiyle özetler: önce monolit yaz, sınırları netleşince böl. Sebep basit; servis sınırlarını yanlış çizmek mikroservis kullanmamaktan daha pahalıdır. Hatalı bölünmüş bir sistem, fiziksel olarak dağıtılmış ama mantıksal olarak monolit gibi davranan — her değişiklikte üç servisi birden deploy etmek gereken — bir karmaşaya dönüşür. Buna distributed monolith denir, mikroservis dünyasının en yaygın patolojisidir.
Microservices ne zaman doğru karardır:
- Ekipler büyüdü, monolitte iki ekip aynı koda dokunmadan ilerleyemiyor.
- Uygulamanın bir parçası diğerinden çok farklı ölçek beklentisine sahip — örneğin, dakikada 10 bin istek gören öneri motoru ile saatte 50 istek gören admin paneli.
- Bağımsız teknoloji seçimi gerekiyor — bir servis Python ML modeli çağırıyor, diğeri .NET ile transactional iş yürütüyor.
- Deploy frekansı modülden modüle çok değişiyor — biri günde 5 kez, diğeri ayda bir.
Bu koşullar henüz mevcut değilse modüler monolit (iyi bölünmüş namespace'lerle tek deploy birimi) genelde daha sağlıklı bir başlangıçtır. Sistem büyüyünce sınırlar belirginleşir, o zaman aşamalı olarak mikroservislere geçilebilir. .NET'le mikroservis tarafına derinleşmek isteyenler için .NET microservices eğitimi mimari kararlardan kod örneklerine kadar tüm katmanı yapılandırılmış biçimde işler.
Sıkça Sorulan Sorular
Microservices kullanmak monolit'ten her zaman daha iyi midir?
Hayır. Küçük ekipler ve net olmayan domain'lerde mikroservis ek yük getirir. Network gecikmesi, distributed transaction zorluğu, dağıtım karmaşası ve operasyonel maliyet eklenir. Martin Fowler'ın 'monolith first' önerisi geçerli: önce iyi tasarlanmış modüler monolit, sınırlar netleştiğinde aşamalı olarak servisleştirme yapılır.
Bir .NET mikroservisi ne kadar küçük olmalı?
Satır sayısı yerine sorumluluk kriteri esastır. Bir mikroservis tek bir iş yeteneğini (örneğin sipariş, fatura, katalog) baştan sona yönetebilmeli ve ekipten bir kişi onu birkaç günde zihninde tutabilmeli. Tipik bir .NET mikroservisi 1000-5000 satır arasıdır; bunun üzeri bölünmeyi, altı ise gereksiz parçalanmayı işaret eder.
.NET'te servisler arası iletişimde HTTP mi gRPC mi tercih edilir?
Dış istemcilerle ve heterojen sistemlerle iletişimde HTTP/JSON, iç servisler arasında gRPC tercih edilir. gRPC binary Protobuf üzerinden çalıştığı için JSON'a kıyasla 3-5 kat hızlıdır ve şema kontrolü derleme zamanında yapılır. Olay yayını ise neredeyse her zaman mesaj kuyruğu ile asenkron yürütülür.
API gateway zorunlu bir bileşen mi?
Tek tip istemcili küçük sistemlerde olmadan da geçilebilir. Ancak farklı istemciler — web, mobile, partner API — farklı veri şekilleri istediğinde, ayrıca authentication, rate limiting, response aggregation merkezi olarak yönetilmek istendiğinde gateway gerekli olur. .NET tarafında YARP veya Ocelot, yönetilen ortamlarda Azure API Management bu rolü üstlenir.
Mikroservis için Kubernetes şart mı?
Şart değil, ama 5-10 servisi aştığında pratik gereklilik haline gelir. Daha küçük ölçekte Docker Compose, Azure Container Apps veya AWS ECS yeterli olur. Kubernetes esneklik kazandırır ama operasyonel öğrenme eğrisi diktir. Yeni başlayan ekiplerin managed bir container platformuyla başlayıp ihtiyaç ortaya çıktığında Kubernetes'e geçmesi daha sağlıklı bir yol haritasıdır.
Birden fazla servisi etkileyen işlemlerde transaction nasıl yönetilir?
Dağıtık ortamda klasik ACID transaction kullanılmaz. Yerine 'saga' deseni uygulanır — uzun süreli iş akışı, her adımı kendi servisi yürütür ve hata durumunda kompansasyon (geri alma) eylemi tetiklenir. .NET'te MassTransit'in saga state machine yapısı bu deseni yapılandırılmış biçimde sunar. Eventual consistency'ye alışmak gerekir.
Mikroservis sisteminde test stratejisi nasıl değişir?
Unit testler aynı kalır, ancak entegrasyon testlerine ek olarak 'contract testing' devreye girer. Bir servisin yaydığı eventin diğer servisin beklediği şemaya uyduğu Pact veya benzer araçlarla doğrulanır. Uçtan uca test sayısı azaltılır; çünkü çok sayıda servisin aynı anda doğru sürümde olmasını gerektirir ve kırılgan hale gelir.


