Mikroservisler, günümüzde yazılım geliştirme endüstrisinde oldukça popüler hale geldi. Bu servisler, monolitik uygulamalardan daha modüler ve ölçeklenebilir bir mimariye sahip olmaları nedeniyle tercih edilir. .NET, mikroservislerin geliştirilmesi için uygun bir çerçeve sunar. Bu yazıda, .NET ile mikroservis geliştirmeye başlamadan önce öğrenilmesi gereken kavramlara ve mimari desenlere kısaca göz atacağız. Bu yazıdan sonra örnek proje ile ilk mikroservis mimaride .net 7 proje geliştireceğiz.
Mikroservis Nedir?
Mikroservis, bir uygulamanın birden fazla küçük, bağımsız ve özerk bileşenlere bölündüğü bir mimaridir. Her bileşen, özelleştirilmiş bir işlevselliğe sahip ve kendine özgü bir veri modeline sahiptir. Bu bileşenler, birbirleriyle iletişim kurabilir ve uygulamanın tamamı için hizmetler sağlayabilir. Mikroservis mimarisi, uygulamanın ölçeklenebilirliğini arttırır ve bir bileşenin düşük performansı diğerlerine etki etmez.
Mikroservis mimarisi, bir uygulamanın birçok küçük parçaya bölünerek bağımsız hizmetler halinde sunulmasıdır. Bu hizmetler, RESTful API’ler kullanarak birbirleriyle iletişim kurarlar ve birlikte çalışarak tam bir uygulama sağlarlar. Mikroservis mimarisi, birçok avantajı beraberinde getirir, örneğin:
- Esneklik: Her bir hizmetin farklı bir şekilde ölçeklendirilmesi mümkündür.
- Bakım kolaylığı: Her hizmet kendi başına bakım ve güncelleme yapılabilir.
- Yüksek ölçeklenebilirlik: Birden fazla hizmetin kullanılması sayesinde uygulamanın ölçeklenebilirliği artar.
- Teknoloji bağımsızlığı: Her hizmet farklı bir teknoloji kullanabilir.
İstemci-Sunucu (Client-Server) Mimarisine Giriş
İstemci-sunucu mimarisi, bir uygulamanın kullanıcı arayüzü (istemci) ve iş mantığı (sunucu) arasında bölündüğü bir mimaridir. İstemci, sunucudan veri talep eder ve sunucu, istemcinin talebine yanıt verir. Bu mimari, uygulamanın ölçeklenebilirliğini arttırır ve işlem yükünü azaltır.
Yük Dengeleme (Load Balancing)
Yük dengeleme, uygulamanın farklı sunucular arasında yükü dengeli bir şekilde dağıtmasını sağlar. Bu, uygulamanın ölçeklenebilirliğini arttırır ve yüksek kullanıcı trafiği altında daha iyi performans sağlar.
API Gateway
API Gateway, bir uygulamanın tüm mikroservislerine tek bir giriş noktası sağlar. Bu, uygulamanın daha modüler hale gelmesini sağlar ve bir mikroservis değiştirildiğinde diğerlerinin etkilenmemesini sağlar.
CQRS
CQRS (Komut ve Sorgu Sorumluluk Ayrımı), bir uygulamanın sorgulama ve değiştirme işlemlerinin ayrılmasıdır. Bu, uygulamanın daha ölçeklenebilir hale gelmesini sağlar ve performansı artırır.
SAGAS
Saga, bir mikroservis mimarisinde işlem yönetimini kolaylaştırmak için kullanılan bir mimari desendir. Saga, bir işlemi küçük adımlara ayırır ve her adımda bir hizmet çağırarak işlemi tamamlar. Her adım bir önceki adımda geri alınabilir ve işlemi tamamlama başarısız olursa geri alınabilir. Bu, işlem yönetimi için daha güvenilir ve sağlam bir yaklaşım sağlar. Dağıtık transaction bölümünde detaylarına değineceğiz.
Containerization
Konteynerleştirme, yazılım uygulamalarını taşınabilir ve tekrar kullanılabilir hale getiren bir teknolojidir. Konteynerler, bir uygulamanın tüm bileşenlerini bir arada tutar ve bu bileşenlerin taşınabilirliğini sağlar. Konteynerler, mikroservislerin taşınabilirliğini artırır ve birçok platformda kolayca çalıştırılabilirler.
Service Registry
Service Registry (Hizmet kayıt defteri), mikroservislerin birbirleriyle iletişim kurmak için kullanacağı adresleri tutar. Bu, mikroservislerin dinamik olarak oluşturulmasını ve silinmesini sağlar. Hizmet kayıt defterleri, uygulamanın yüksek ölçeklenebilirliği için önemlidir.
Circuit Breaker
Devre kesici, bir mikroservisin çalışma zamanında hatalar meydana geldiğinde kullanılan bir desendir. Devre kesici, hatalı mikroservislere bağlanan çağrıları engeller ve bu mikroservislerin yüklenmesini önler. Bu, sistemdeki diğer mikroservislerin çalışmasını engellemeden bir sorunun izole edilmesini sağlar.
Event Driven Architecture
Olay odaklı mimari, uygulamaların dinamik ve ölçeklenebilir olmasını sağlar. Bu mimaride, mikroservisler olayları dinleyerek birbirleriyle etkileşime geçerler. Bu, uygulamaların esnek ve ölçeklenebilir olmasını sağlar.
Sonuç olarak, .NET ile mikroservis geliştirmeye başlamadan önce bu kavramlar ve mimari desenler hakkında bilgi sahibi olmak önemlidir. Bu, mikroservis mimarisinin anahtar özelliklerini anlamaya yardımcı olacak ve uygulamanızın tasarımında daha doğru kararlar vermenize yardımcı olacaktır.
Teknolojiler
Yukarıda yaklaşımlara değindik kısaca teknolojilerden de bahsetmek gerekirse:
ASP.NET Core
ASP.NET Core, hızlı ve ölçeklenebilir web uygulamaları ve mikroservisler geliştirmek için kullanılan bir çerçeve ve sunucu tarafı teknolojisidir. Bu teknoloji, açık kaynak kodlu ve çoklu platform desteği sunar. ASP.NET Core, HTTP API’leri, RESTful hizmetleri ve gRPC gibi iletişim protokollerini destekler.
Entity Framework Core
Entity Framework Core, .NET geliştiricilerinin veritabanlarına erişmek için kullanabilecekleri açık kaynaklı bir ORM (Object-Relational Mapping) çerçevesidir. Bu çerçeve, mikroservislerin veritabanlarına bağlanmasını ve veri erişimini kolaylaştırır.
RabbitMQ
RabbitMQ, açık kaynaklı bir mesaj kuyruğu yazılımıdır. Bu yazılım, mikroservisler arasındaki iletişim için kullanılabilir ve mesajlaşma tabanlı mimariler için idealdir.
Docker
Docker, konteynerleştirme için kullanılan açık kaynaklı bir platformdur. Bu teknoloji, mikroservislerin paketlenmesini, taşınmasını ve dağıtılmasını kolaylaştırır. Docker, .NET uygulamalarının konteynerize edilmesi için sıkça kullanılır.
Kubernetes
Kubernetes, açık kaynaklı bir konteyner orkestrasyon sistemidir. Bu teknoloji, mikroservislerin dağıtımını ve ölçeklendirilmesini kolaylaştırır. Kubernetes, .NET uygulamalarının dağıtımı için de kullanılabilir.
Consul
Consul, hizmet keşfi, sağlık kontrolü ve yapılandırma yönetimi gibi işlevleri yerine getiren açık kaynaklı bir hizmet ağıdır. Bu teknoloji, mikroservislerin yönetimi için kullanılabilir.
Kafka
Kafka, Apache tarafından geliştirilen açık kaynaklı bir veri akışı platformudur. Kafka, olay tabanlı mimarilerin uygulanmasına yardımcı olan bir veri yönetim platformudur. Kafka, yüksek hacimli, gerçek zamanlı veri akışları için ölçeklenebilir ve dayanıklı bir çözüm sunar.
Kafka, bir mesajlaşma sistemi olarak çalışır ve mesajları topic’lerde organize eder. Mikroservisler, Kafka üzerinden birbirleriyle iletişim kurabilir ve olayları birbirleriyle paylaşabilir. Bu sayede, mikroservisler arasındaki iletişim daha esnek ve ölçeklenebilir hale gelir.
Kafka, .NET için birçok kütüphane sunar. .NET geliştiricileri, Kafka’yı .NET Core uygulamalarında kullanabilirler. Kafka.NET, Confluent.Kafka ve Burrow.NET, .NET geliştiricilerinin Kafka’yı kullanmalarına yardımcı olan popüler kütüphanelerdir.
Kafka, mikroservisler için birçok avantaj sağlar. Kafka’nın hızlı, ölçeklenebilir ve dayanıklı yapısı, mikroservislerin hızlı ve güvenilir bir şekilde veri akışı yapmasına yardımcı olur. Ayrıca, Kafka, mikroservisler arasında asenkron iletişim sağlayarak mikroservislerin daha az bağımlı hale gelmesini sağlar.
Keycloak
Keycloak, Red Hat tarafından geliştirilen açık kaynaklı bir kimlik doğrulama ve yetkilendirme çözümüdür. Keycloak, web uygulamaları ve mikroservisler gibi farklı uygulama türleri için kimlik doğrulama ve yetkilendirme yönetimini kolaylaştırmayı amaçlar.
Keycloak, OAuth 2.0 ve OpenID Connect protokollerini destekleyerek, uygulamaların kolayca kimlik doğrulama ve yetkilendirme yapmasına olanak tanır. Keycloak, kullanıcıların kimlik doğrulama ve yetkilendirme bilgilerini güvenli bir şekilde saklar ve doğrulama ve yetkilendirme işlemlerini yönetir.
Keycloak, .NET Core ile entegrasyonu kolay olan birçok kütüphane sunar. .NET Core uygulamaları, Keycloak OAuth 2.0 veya OpenID Connect protokollerini kullanarak kimlik doğrulama ve yetkilendirme yapabilirler. Keycloak .NET, Keycloak .NET Core ve Keycloak .NET SDK gibi kütüphaneler, .NET geliştiricilerinin Keycloak’u kullanmalarına yardımcı olur.
Keycloak, mikroservisler için birçok avantaj sağlar. Mikroservisler, Keycloak üzerinden kimlik doğrulama ve yetkilendirme yaparak güvenli bir şekilde çalışabilirler. Keycloak, merkezi bir kimlik doğrulama ve yetkilendirme yönetimi sağlayarak mikroservislerin güvenliğini artırır ve uygulama geliştiricilerinin kimlik doğrulama ve yetkilendirme işlemlerini kolaylaştırır.
Dapr
Dapr, .NET Core ile de uyumlu bir platformdur. .NET geliştiricileri, Dapr’ı kullanarak mikroservislerin birbirleriyle iletişimini ve veri paylaşımını kolaylaştırabilirler. Dapr, birçok mikroservis için kullanılabilecek önceden yazılmış bileşenler ve özellikler sunar. Örneğin, Dapr tarafından sunulan state management, secret management ve pub/sub sistemleri, .NET Core mikroservislerinin geliştiricilerinin kendi kodlarını yazmadan hızlı bir şekilde bu özellikleri uygulamalarına olanak tanır.
Istio
Istio, mikroservislerin trafik yönetimini kolaylaştıran bir hizmet ağıdır. Istio, mikroservisler arasında iletişim sağlamak için Envoy adlı bir yan yana çalışan proxy kullanır. Envoy, mikroservisler arasındaki trafiği yönetir ve yönlendirir. Istio, mikroservisler arasındaki trafik yönetimini sağlamak için birçok özellik sunar, örneğin trafik yönlendirme, güvenlik, hata yönetimi ve izleme.
Istio, .NET Core uygulamaları ile de uyumludur. .NET geliştiricileri, Istio’yu kullanarak mikroservislerinin trafik yönetimini kolaylaştırabilirler. Örneğin, Istio tarafından sunulan trafik yönlendirme özelliği, .NET Core mikroservislerinin trafik akışını yönlendirmelerine olanak tanır.
Dapr ve Istio, mikroservisler için açık kaynaklı platformlar ve hizmet ağlarıdır. Dapr, uygulama geliştiricilerine, uygulamalarını hızlı bir şekilde oluşturmalarına, test etmelerine ve dağıtmalarına yardımcı olan bir platformdur. Istio ise, mikroservisler arasındaki iletişimi ve trafik yönetimini yöneten bir hizmet ağıdır. Dapr ve Istio, mikroservisler için birçok avantaj sağlar. Dapr, .NET Core geliştiricilerinin kodlarını daha hızlı yazmalarına ve uygulamalarını daha hızlı geliştirmelerine olanak tanır. Istio ise, mikroservisler arasındaki trafik yönetimini kolaylaştırır ve güvenliği artırır. Bu platformlar, .NET Core geliştiricilerinin mikroservisleri daha iyi yönetmelerine ve daha güvenli hale getirmelerine yardımcı olur.
Kütüphaneler
- Dapper: .NET için hızlı ve hafif bir ORM kütüphanesidir.
- Polly: Hata toleransı ve istisna yönetimi için kullanılan bir kütüphanedir. Mikroservislerin sağlamlığını artırmak için sıklıkla kullanılır.
- Serilog: Loglama için kullanılan bir kütüphanedir. Bu kütüphane, mikroservislerin çalışmasını izlemek ve hataları izlemek için kullanılır.
- AutoMapper: Nesne eşlemesi için kullanılan bir kütüphanedir. Bu kütüphane, mikroservislerin farklı nesne tipleri arasında veri taşımasını kolaylaştırır.
- Steeltoe: .NET Core ve Spring Cloud arasında bir köprü görevi görür. Bu kütüphane, .NET Core tabanlı mikroservislerin, Spring Cloud tabanlı mikroservislerle çalışmasını sağlar.
- IdentityServer: Kimlik doğrulama ve yetkilendirme için kullanılan bir kütüphanedir. Bu kütüphane, mikroservislerin güvenliği için kullanılır.
- MassTransit: Mesajlaşma tabanlı mimariler için kullanılan bir kütüphanedir. Bu kütüphane, RabbitMQ ve Kafka gibi mesajlaşma sistemleriyle çalışabilir.
- MediatR: Mediator pattern kullanarak, mikroservisler arasındaki iletişimi kolaylaştıran bir kütüphanedir. Bu kütüphane, mikroservislerin bağımlılıklarını azaltmak için kullanılır.
- FluentValidation: Doğrulama için kullanılan bir kütüphanedir. Bu kütüphane, mikroservislerin girdilerini doğrulamak ve hataları önlemek için kullanılır.
Örnek Projeler
- eShopOnContainers: Microsoft tarafından geliştirilen ve .NET Core kullanılarak oluşturulmuş bir mikroservis tabanlı e-ticaret platformudur.
- MusicStore: .NET Core ve Angular kullanılarak oluşturulmuş bir örnek uygulamadır. Bu uygulama, mikroservis mimarisini kullanarak müzik mağazası işlevleri sunar.
- HealthClinic.biz: Microsoft tarafından geliştirilen ve .NET Core kullanılarak oluşturulmuş bir örnek uygulamadır. Bu uygulama, mikroservis mimarisini kullanarak sağlık klinikleri için bir yönetim sistemidir.
Bu, .NET’in mikroservisler için sağladığı bazı teknolojiler, örnek projeler ve kütüphanelerdir. .NET geliştiricileri, bu teknolojileri kullanarak hızlı, güvenilir ve ölçeklenebilir mikroservisler oluşturabilirler.