İçindekiler
Bölüm 1: Giriş
1.1 Mikroservis Mimarisi Nedir?
1.2 Monolitik ve Mikroservis Mimarilerinin Karşılaştırılması
1.3 Mikroservislerin Avantaj ve Dezavantajları
1.4 Mikroservis Mimarisine Geçiş Süreci
Bölüm 2: Spring Cloud Ekosistemi
2.1 Spring Framework ve Spring Boot’a Giriş
2.2 Spring Cloud Nedir?
2.3 Spring Cloud Bileşenleri ve Modülleri
Bölüm 3: Servis Keşfi ve Yönlendirme
3.1 Eureka Server ile Servis Keşfi
3.2 Spring Cloud Gateway ile API Yönlendirme
3.3 Yük Dengeleme ve Yüksek Erişilebilirlik
3.4 Feign Client
Bölüm 4: Yapılandırma Yönetimi
4.1 Config Server ile Merkezi Yapılandırma
4.2 Spring Cloud Config ile Konfigürasyon Yönetimi
4.3 Güvenli Konfigürasyon Yönetimi (Vault ile Entegrasyon)
Bölüm 5: Dayanıklılık ve Güvenlik
5.1 Spring Cloud Circuit Breaker ve Hystrix ile Devre Kesici Deseni
5.2 Timeouts, Retry ve Fallback Yapılandırmaları
5.3 OAuth2 ve Spring Security ile Mikroservis Güvenliği
Bölüm 6: Mesajlaşma ve Veri İletişimi
6.1 Apache Kafka ile Mesajlaşma
6.2 Spring Cloud Stream ile Olay Odaklı Mimariler
6.3 Veritabanları Arasında Veri Senkronizasyonu
Bölüm 7: Dağıtık Sistemlerin İzlenmesi ve Yönetimi
7.1 Zipkin ve Sleuth ile Dağıtık İzleme
7.2 Prometheus ve Grafana ile İzleme ve Analitik
7.3 Log Yönetimi ve ELK Stack Entegrasyonu
Bölüm 8: Docker ve Kubernetes ile Mikroservislerin Konteynerleştirilmesi
8.1 Docker ve Kubernetes Temelleri
8.2 Mikroservisleri Docker ile Konteynerleştirme
8.3 Kubernetes ile Mikroservislerin Yönetimi
Bölüm 9: CI/CD ve DevOps
9.1 Jenkins ile CI/CD Pipeline Kurulumu
9.2 Spring Cloud ve GitOps Prensipleri
9.3 Kubernetes Üzerinde Sürekli Dağıtım
Bölüm 10: AWS Üzerinde Mikroservis Dağıtımı
10.1 AWS Üzerine Spring Cloud Mikroservisleri Yerleştirme
10.2 AWS Üzerinde Yönetilen Servislerin Kullanımı
10.3 AWS Lambda ve Serverless Entegrasyonu
Ekler
- Ek A: Spring Cloud için En İyi Uygulamalar
- Ek B: Mikroservis Mimarisi için Desenler ve Anti-Desenler
- Ek C: Sorun Giderme ve Performans İyileştirme
- Ek D: Kaynaklar ve İleri Okuma
1.1 Mikroservis Mimarisi Nedir?
Mikroservis mimarisi, bir yazılım uygulamasını küçük, bağımsız olarak dağıtılabilir ve yönetilebilir parçalara ayırarak geliştirme ve dağıtma yaklaşımıdır. Bu yaklaşımla, her mikroservis belirli bir işlevi veya hizmeti yerine getirir ve tek başına çalışabilir; diğer mikroservislerle belirlenmiş arayüzler aracılığıyla iletişim kurar. Mikroservis mimarisi, özellikle büyük ve karmaşık sistemlerin daha kolay yönetilmesini ve ölçeklenmesini sağlar.
Mikroservis Mimarisi’nin Temel Özellikleri
- Bağımsız Dağıtım: Her mikroservis, bağımsız olarak geliştirilip dağıtılabilir. Bu, bir serviste yapılan değişikliklerin tüm sistemi etkilemeden uygulanabileceği anlamına gelir.
- Tek Bir Sorumluluğa Odaklanma: Her mikroservis, tek bir işlev veya sorumluluk etrafında yapılandırılır. Bu yaklaşım, kod tabanını modüler hale getirir ve bakımını kolaylaştırır.
- Teknoloji Bağımsızlığı: Mikroservislerin her biri, ihtiyaçlarına göre farklı teknolojiler kullanabilir. Örneğin, bir mikroservis Java ile yazılabilirken bir diğeri Python veya Node.js ile geliştirilebilir.
- Bağımsız Veri Yönetimi: Her mikroservis kendi veritabanına sahip olabilir ve diğer mikroservislerin veri yapılarından bağımsız çalışabilir. Bu yapı, veri bağımsızlığını ve ölçeklenebilirliği artırır.
- Dağıtık Sistem İletişimi: Mikroservisler arasındaki iletişim genellikle HTTP/REST, gRPC veya mesajlaşma sistemleri (Kafka, RabbitMQ gibi) aracılığıyla gerçekleştirilir. Bu tür iletişim, mikroservislerin birlikte çalışmasını sağlar.
Mikroservis Mimarisi’nin Sağladığı Avantajlar
- Kolay Bakım ve Güncelleme: Mikroservislerin bağımsız olarak güncellenebilmesi, bakım işlemlerinin daha az hata riski ile yapılmasını sağlar.
- Esneklik ve Teknoloji Seçimi: Farklı mikroservisler farklı diller veya veritabanları kullanabilir, bu da teknolojik esneklik sağlar.
- Ölçeklenebilirlik: Yoğun trafik alan mikroservisler ayrı ayrı ölçeklenebilir, bu sayede sistem kaynakları daha verimli kullanılır.
- Hızlı Geliştirme: Takımlar, mikroservislerin bağımsız yapısından faydalanarak farklı özellikler üzerinde paralel çalışabilir.
Mikroservis Mimarisi’nin Zorlukları
- Dağıtık Sistem Karmaşıklığı: Mikroservisler dağıtık bir yapıya sahip olduğu için hata ayıklama, izleme ve yönetim karmaşık hale gelebilir.
- Servisler Arası İletişim: Mikroservisler arasında veri alışverişini yönetmek ve bu iletişimi hızlı ve güvenilir hale getirmek zorlayıcıdır.
- Veri Tutarlılığı: Mikroservisler bağımsız veri depolarına sahip olduklarında veri tutarlılığını sağlamak karmaşık olabilir. Dağıtık işlemler ve eventual consistency yönetilmelidir.
Mikroservis mimarisi, özellikle büyüyen veya yüksek ölçeklenebilirlik gerektiren projelerde tercih edilen modern bir yaklaşımdır. Netflix, Amazon gibi büyük ölçekli şirketlerin mikroservisleri benimsemiş olması, bu yapının geniş kapsamlı projelerde sağladığı avantajları gösterir.
1.2 Monolitik ve Mikroservis Mimarilerinin Karşılaştırılması
Monolitik ve mikroservis mimarileri, yazılım sistemleri geliştirme ve dağıtma konusunda iki temel yaklaşımı temsil eder. Her iki mimarinin de kendine özgü avantajları ve dezavantajları vardır; bu yüzden, projeye ve organizasyonun ihtiyaçlarına göre doğru olanı seçmek önemlidir.
Monolitik Mimari Nedir?
Monolitik mimari, yazılım uygulamasının tüm bileşenlerinin tek bir kod tabanında ve tek bir yürütülebilir dosya içinde birleştirildiği bir yapıdır. Bu mimaride uygulamanın tüm modülleri sıkı bir şekilde birbirine bağlıdır ve dağıtım işlemi tüm sistem için bir kerede yapılır.
Özellikleri:
- Tek bir uygulama olarak çalışır.
- Bileşenler arasında sıkı bağımlılıklar vardır.
- Tek bir kod tabanına sahiptir ve genellikle tek bir veritabanı kullanır.
- Dağıtım, tüm sistem için bir kerede yapılır.
Avantajları:
- Basitlik: Kod tabanının tek bir yerde olması yönetimi kolaylaştırır. Genellikle küçük projelerde veya yeni başlayan takımlar için tercih edilir.
- Performans: Aynı süreç içinde çalıştıkları için modüller arasında doğrudan ve hızlı iletişim sağlanır.
- Geliştirme ve Test Kolaylığı: Tüm uygulama tek bir çatı altında olduğu için geliştirme, test ve hata ayıklama süreçleri daha basittir.
Dezavantajları:
- Ölçeklenebilirlik Sorunları: Tüm uygulamanın tek bir yapıda olması, yoğun trafik alan bileşenlerin bağımsız olarak ölçeklenememesi sorununu yaratır.
- Güncelleme Zorluğu: Her değişiklikte tüm uygulama baştan dağıtılmalıdır, bu da güncelleme süreçlerini zorlaştırır.
- Esneklik Eksikliği: Farklı teknolojiler kullanmak zordur; tüm uygulama aynı teknoloji yığınına bağımlıdır.
Mikroservis Mimari Nedir?
Mikroservis mimarisi, bir yazılım uygulamasını küçük, bağımsız hizmetlere ayırarak geliştirme ve dağıtma yaklaşımıdır. Her mikroservis, belirli bir işlevi veya özelliği yerine getirmek için tasarlanır ve bağımsız olarak geliştirilip dağıtılabilir.
Özellikleri:
- Her servis kendi başına çalışır ve bağımsız dağıtılabilir.
- Her bir servis belirli bir işlevi yerine getirir.
- Servisler farklı teknolojilerle geliştirilebilir.
- Her servis kendi veritabanına sahip olabilir.
Avantajları:
- Ölçeklenebilirlik: Yoğun trafik alan mikroservisler bağımsız olarak ölçeklenebilir, bu da kaynakların verimli kullanılmasını sağlar.
- Bağımsız Geliştirme ve Dağıtım: Her mikroservis bağımsız geliştirilebilir, test edilebilir ve dağıtılabilir; bu, hızlı güncellemeleri mümkün kılar.
- Esneklik: Farklı mikroservisler için farklı programlama dilleri, veritabanları veya teknolojiler kullanılabilir.
- Arıza İzolasyonu: Bir mikroservisin başarısızlığı tüm sistemi etkilemez; sadece o servisin işlevleri geçici olarak kesintiye uğrar.
Dezavantajları:
- Yönetim Zorlukları: Mikroservislerin sayısının artmasıyla yönetim, izleme ve hata ayıklama süreçleri daha karmaşık hale gelir.
- Servisler Arası İletişim: Mikroservislerin birbirleriyle iletişimi, ek ağ gecikmeleri ve potansiyel güvenlik sorunları yaratabilir.
- Veri Tutarlılığı: Mikroservisler bağımsız veri yönetimi sağladığı için veri tutarlılığını korumak zor olabilir.
- Dağıtık Sistem Karmaşıklığı: Mikroservisler dağıtık sistemler olduğu için dayanıklılık, güvenlik ve izleme gibi dağıtık sistemlere özgü sorunlarla başa çıkılması gerekir.
Monolitik ve Mikroservis Mimarilerinin Karşılaştırması
Özellik | Monolitik Mimari | Mikroservis Mimari |
Yapı | Tek bir uygulama | Küçük, bağımsız servisler |
Teknoloji Esnekliği | Tek bir teknoloji yığını | Farklı servisler için farklı teknolojiler kullanılabilir |
Ölçeklenebilirlik | Sınırlı, tüm uygulama ölçeklenir | Servis bazında, bağımsız ölçeklenebilir |
Dağıtım | Tüm uygulama tek seferde dağıtılır | Her servis bağımsız dağıtılabilir |
Bakım ve Güncelleme | Tüm uygulamanın güncellenmesi gerekir | Sadece ilgili mikroservis güncellenebilir |
Hata İzolasyonu | Uygulamanın tamamını etkiler | Arıza sadece ilgili mikroservisi etkiler |
Veri Yönetimi | Tek bir veritabanı | Her servis kendi veritabanına sahip olabilir |
Servisler Arası İletişim | Doğrudan çağrılar | API’ler veya mesajlaşma sistemleri aracılığıyla |
Yönetim | Daha basit, merkezi yönetim | Dağıtık yönetim gerektirir |
Hangi Mimariyi Seçmeliyiz?
- Monolitik mimari, küçük ve orta ölçekli projelerde veya başlangıç aşamasındaki uygulamalarda idealdir. Projenin geliştirilmesi, bakımı ve yönetimi daha az karmaşıktır.
- Mikroservis mimarisi, büyük, karmaşık ve sürekli ölçeklenmesi gereken projeler için daha uygundur. Geliştirme ekipleri bağımsız olarak çalışabilir, uygulama bileşenleri modüler olduğu için kolayca güncellenebilir ve ölçeklenebilir.
Bu karşılaştırmalar, hangi mimarinin kullanılacağına karar verirken dikkate alınması gereken önemli noktaları ortaya koymaktadır.
1.3 Mikroservislerin Avantaj ve Dezavantajları
Mikroservis mimarisi, günümüzde özellikle büyük ve karmaşık sistemlerin geliştirilmesinde yaygın olarak tercih edilen bir yaklaşımdır. Ancak, her mimari gibi mikroservislerin de avantajları ve dezavantajları vardır. Aşağıda mikroservis mimarisinin öne çıkan avantajları ve dezavantajları detaylandırılmıştır.
Mikroservislerin Avantajları
- Ölçeklenebilirlik:
- Mikroservisler bağımsız olarak ölçeklenebilir. Özellikle trafiği yüksek olan servisler ihtiyaca göre yatay veya dikey olarak ölçeklenebilir. Bu, sistem kaynaklarının daha verimli kullanılmasını sağlar.
- Örneğin, bir e-ticaret sitesinde, en çok trafik alan ödeme işlemleri mikroservisler aracılığıyla diğer bileşenlerden bağımsız olarak ölçeklenebilir.
- Bağımsız Geliştirme ve Dağıtım:
- Mikroservisler, bağımsız olarak geliştirilebilir ve dağıtılabilir. Bu, geliştirme ekiplerinin paralel çalışmasına imkan tanır. Her mikroservis bağımsız olarak güncellenebildiği için dağıtım süreçleri daha hızlıdır.
- Bu özellik, hata düzeltmeleri veya yeni özelliklerin daha hızlı şekilde sisteme eklenmesini sağlar.
- Esneklik ve Teknoloji Seçimi:
- Her mikroservis, işlevine en uygun teknoloji ve dil ile geliştirilebilir. Bu sayede, projedeki her bir mikroservis farklı teknolojilerle yazılabilir, böylece optimum performans sağlanır.
- Örneğin, bir mikroservis Java ile yazılabilirken, başka bir mikroservis Python veya Node.js ile geliştirilebilir.
- Arıza İzolasyonu:
- Mikroservis mimarisinde, bir mikroservisin arızalanması tüm sistemi etkilemez; yalnızca o servise bağlı işlevlerde aksama yaşanır. Bu, sistemin genel güvenilirliğini artırır.
- Örneğin, bir e-ticaret uygulamasında envanter servisi çökse bile, kullanıcılar diğer işlemleri gerçekleştirmeye devam edebilir.
- Bakım Kolaylığı:
- Mikroservisler, küçük ve bağımsız birimler olarak yapılandırıldığından, her bir mikroservisin bakımı, güncellenmesi ve test edilmesi daha kolaydır. Modüler yapı, kodun daha anlaşılır ve yönetilebilir olmasını sağlar.
- Bu özellik, özellikle sürekli geliştirme ve güncelleme gerektiren projelerde oldukça faydalıdır.
- Dağıtık Takımlarla Çalışma:
- Mikroservis mimarisi, farklı takımların belirli mikroservislerden sorumlu olmasına imkan tanır. Bu, organizasyonel olarak ölçeklenebilirliği sağlar ve ekiplerin bağımsız çalışmasına olanak verir.
- Bu sayede, aynı anda birden fazla özellik veya servis geliştirilip sisteme entegre edilebilir.
Mikroservislerin Dezavantajları
- Yönetim Zorlukları:
- Mikroservislerin artmasıyla birlikte, bu servislerin izlenmesi, yönetimi ve sürdürülmesi karmaşık hale gelir. Dağıtık bir yapıya sahip oldukları için merkezi bir yönetim yapılandırması gerektirir.
- Özellikle izleme, hata ayıklama ve yapılandırma yönetimi süreçleri karmaşıklaşır.
- Servisler Arası İletişim Karmaşıklığı:
- Mikroservisler, genellikle API çağrıları veya mesajlaşma sistemleri üzerinden iletişim kurar. Bu, ağ üzerinden yapılan çağrılar nedeniyle gecikmelere ve potansiyel performans sorunlarına yol açabilir.
- Ayrıca, bu iletişim karmaşıklaştıkça güvenlik, hata ayıklama ve veri bütünlüğünü sağlama konularında zorluklar oluşur.
- Veri Tutarlılığı:
- Mikroservisler bağımsız veri depolarına sahip olabilir. Bu durum, dağıtık sistemlerdeki eventual consistency (geç tutarlılık) sorunu gibi veri tutarlılığı zorluklarına yol açabilir.
- Örneğin, bir bankacılık uygulamasında işlemler arası veri tutarlılığı sağlamak daha karmaşık hale gelir.
- Dağıtık Sistem Karmaşıklığı:
- Mikroservisler dağıtık sistemlerin bir parçası olduğu için altyapı ve ağ sorunları gibi dağıtık sistemlerin doğal zorluklarıyla başa çıkmak gerekir. Dayanıklılık, güvenlik ve erişilebilirlik gibi sorunlar daha büyük bir önem kazanır.
- Dağıtık işlemler, olay temelli iletişim gibi konular daha karmaşık hale gelir ve bunların yönetilmesi uzmanlık gerektirir.
- Kapsamlı İzleme ve Log Yönetimi İhtiyacı:
- Mikroservisler dağıtık yapıdan dolayı kapsamlı bir izleme, log yönetimi ve hata ayıklama süreci gerektirir. Her bir servisin bağımsız olarak izlenmesi, sorunların kök neden analizini yapabilmek için elzemdir.
- Bu da ek bir izleme altyapısı, merkezi log yönetimi ve dağıtık izleme araçları ihtiyacını doğurur.
- Ağ Performansı ve Latency (Gecikme) Sorunları:
- Mikroservisler arasındaki iletişim genellikle HTTP, gRPC gibi ağ üzerinden yapılır. Bu iletişim, gecikmelere yol açabilir ve genel sistem performansını etkileyebilir.
- Mikroservislerin birbirlerine bağımlılığı arttıkça, ağ trafiği ve latency sorunları daha belirgin hale gelir.
- Gelişmiş Altyapı Gereksinimleri:
- Mikroservislerin çalışması ve yönetimi için DevOps altyapısının iyi bir şekilde yapılandırılması gerekir. Sürekli Entegrasyon (CI) ve Sürekli Dağıtım (CD) gibi DevOps süreçleri mikroservislerin yönetiminde önemli bir rol oynar.
- Ayrıca Docker, Kubernetes gibi konteynerleşme ve orkestrasyon araçları mikroservislerin başarılı bir şekilde yönetilmesi için önemlidir.
Mikroservislerin Avantajları ve Dezavantajları Tablosu
Avantajlar | Dezavantajlar |
Ölçeklenebilirlik | Yönetim zorlukları |
Bağımsız geliştirme ve dağıtım | Servisler arası iletişim karmaşıklığı |
Teknolojik esneklik | Veri tutarlılığı sorunları |
Arıza izolasyonu | Dağıtık sistem karmaşıklığı |
Bakım kolaylığı | İzleme ve log yönetimi ihtiyacı |
Dağıtık takımlarla çalışma | Ağ performansı ve gecikme sorunları |
Gelişmiş altyapı gereksinimleri |
Mikroservis mimarisi, büyük ve ölçeklenebilir sistemler için güçlü bir seçenek olmakla birlikte, altyapısal karmaşıklık ve yönetim zorlukları nedeniyle iyi bir planlama gerektirir. Bu avantaj ve dezavantajların dikkate alınması, mikroservis mimarisinin projeye uygun olup olmadığını belirlemek için kritiktir.
1.4 Mikroservis Mimarisine Geçiş Süreci
Mevcut bir monolitik mimariyi mikroservis mimarisine dönüştürmek, oldukça dikkatli bir planlama ve uygulama gerektiren bir süreçtir. Bu geçiş sürecinde, sistemin mevcut yapısını analiz etmek, doğru mikroservisleri tanımlamak ve yeni mimarinin zorluklarını yönetmek büyük önem taşır. Aşağıda, mikroservis mimarisine geçiş sürecinin temel adımları ve dikkat edilmesi gereken noktalar detaylandırılmıştır.
Mikroservis Mimarisine Geçiş Adımları
- Mevcut Sistemin Analizi:
- Geçiş sürecine başlamadan önce mevcut sistemin detaylı bir analizi yapılmalıdır. Sistemin bağımlılıkları, veri akışı, işlevsel ve teknik gereksinimleri belirlenir.
- Özellikle hangi modüllerin en çok kullanılan ve yoğun yük altında kalan bölümler olduğu tespit edilir. Bu modüller, mikroservis haline getirilecek ilk bileşenler olabilir.
- Mikroservislerin Belirlenmesi:
- Analiz sonrasında, uygulamanın hangi parçalarının bağımsız mikroservisler olarak ayrılabileceği belirlenir. Bu adımda, her mikroservisin tek bir işlevi yerine getirmesi ve diğer servislerden bağımsız çalışabilmesi hedeflenir.
- Bu süreçte, Domain-Driven Design (DDD) gibi kavramsal tasarım yöntemlerinden yararlanılarak, alanlar (domain) ve sınırlı bağlamlar (bounded context) belirlenir. Bu sayede, mikroservislerin sorumluluk sınırları çizilmiş olur.
- Veri Yönetimi Stratejisinin Belirlenmesi:
- Mikroservis mimarisinde her bir mikroservisin kendi veritabanına sahip olması önerilir. Bu, veri bağımsızlığını sağlar ancak aynı zamanda veri tutarlılığı zorluklarını beraberinde getirir.
- Verilerin mikroservisler arasında nasıl paylaşılacağı, eventual consistency (geç tutarlılık) ve dağıtık veritabanı yönetimi gibi stratejiler göz önünde bulundurularak planlanmalıdır.
- Servisler Arası İletişim Protokollerinin Seçilmesi:
- Mikroservisler arasında iletişim genellikle RESTful API, gRPC veya mesajlaşma sistemleri (örneğin, RabbitMQ, Kafka) üzerinden sağlanır. Bu protokoller arasından projeye en uygun olanı seçilmelidir.
- İletişim protokolü seçimi yapılırken, gecikme süresi, performans ve güvenlik ihtiyaçları göz önünde bulundurulmalıdır.
- Mikroservislerin Adım Adım Geçirilmesi:
- Geçiş süreci, tüm sistemi bir anda mikroservislere dönüştürmek yerine adım adım ve iteratif bir şekilde yapılmalıdır. Bu yaklaşım, daha kontrollü ve düşük riskli bir geçiş sağlar.
- Öncelikle bağımsız çalışabilecek, sistemin en az bağımlı modülleri mikroservislere ayrılarak geçiş başlatılır. Böylece, geçiş sırasında kullanıcı deneyimi en az seviyede etkilenir.
- API Gateway ve Yönlendirme Yapılandırması:
- Mikroservislerin düzgün bir şekilde çalışabilmesi için bir API Gateway kullanmak önemlidir. API Gateway, kullanıcı isteklerini ilgili mikroservise yönlendirir ve mikroservislerin dış dünya ile etkileşimlerini düzenler.
- Bu katman, yük dengeleme, güvenlik ve hız sınırlama gibi özellikler de sunarak uygulamanın performansını ve güvenliğini artırır.
- Dayanıklılık ve İzleme Yapısının Kurulması:
- Mikroservis mimarisinde, sistemdeki hataları izlemek ve yönetmek için bir dayanıklılık yapısı oluşturmak gerekir. Circuit Breaker (devre kesici) gibi desenler kullanılarak, servislerin arızalandığında diğer servisleri etkilememesi sağlanır.
- Ayrıca, her mikroservisin durumunu izlemek için merkezi izleme ve log yönetimi araçları (Prometheus, Grafana, ELK Stack gibi) kullanılarak kapsamlı bir izleme altyapısı kurulmalıdır.
- DevOps ve CI/CD Süreçlerinin Entegre Edilmesi:
- Mikroservislerin bağımsız olarak geliştirilip dağıtılabilmesi için DevOps süreçlerinin ve Sürekli Entegrasyon/Sürekli Dağıtım (CI/CD) altyapısının sağlanması gereklidir.
- Jenkins, GitLab CI, CircleCI gibi araçlar kullanılarak, her bir mikroservisin bağımsız olarak test edilip dağıtılabileceği otomatikleştirilmiş bir pipeline oluşturulur.
- Kapsayıcılar (Containers) ve Orkestrasyon (Kubernetes) ile Yönetim:
- Mikroservisler, Docker gibi kapsayıcılar içinde çalıştırılarak daha taşınabilir ve yönetilebilir hale getirilir. Bu, bağımlılıkların yönetimini kolaylaştırır ve tutarlılık sağlar.
- Kubernetes gibi orkestrasyon araçları, mikroservislerin ölçeklenmesi, yeniden başlatılması ve yük dengelemesi gibi süreçleri otomatikleştirir, böylece sistem yönetimi daha etkili hale gelir.
- Kullanıcı Geri Bildirimlerinin Toplanması ve İyileştirmeler:
- Geçiş süreci boyunca kullanıcı deneyimini izlemek ve geri bildirim toplamak önemlidir. Yeni mimari ile kullanıcıların karşılaşabileceği sorunlar belirlenmeli ve hızlıca çözülmelidir.
- Geçiş tamamlandıktan sonra mikroservislerin performansı ve kullanıcı deneyimi değerlendirilerek gerekli iyileştirmeler yapılır.
Mikroservis Mimarisine Geçişte Dikkat Edilmesi Gerekenler
- Karmaşıklık Yönetimi: Mikroservislere geçiş, sistemin yönetimini karmaşıklaştırabilir. Bu yüzden, geçiş sürecinde fazladan karmaşıklık getiren adımlardan kaçınılmalı ve mikroservisler aşamalı olarak devreye alınmalıdır.
- Doğru Modülleme: Mikroservislere ayrılan bileşenlerin doğru bir şekilde belirlenmesi çok önemlidir. Aksi takdirde, aşırı ince tanımlanmış veya aşırı bağımlı servisler sistemin verimliliğini olumsuz etkileyebilir.
- Veri Tutarlılığı: Mikroservislerin kendi veritabanlarına sahip olmaları nedeniyle veri tutarlılığına dikkat edilmelidir. Veri tutarlılığı sorunlarını önlemek için dağıtık veritabanı yönetimi stratejileri benimsenmelidir.
- İzleme ve Hata Yönetimi: Mikroservislerde sorunları tespit etmek zor olabilir. Bu nedenle güçlü bir izleme ve hata yönetimi sistemi kurulmalıdır.
- Takım Eğitimleri: Mikroservislere geçiş, sadece teknik değil, aynı zamanda organizasyonel bir değişim gerektirir. Takımlar, mikroservis mimarisi konusunda eğitilmeli ve sistemin nasıl yönetileceği konusunda bilgi sahibi olmalıdır.
Sonuç
Mikroservis mimarisine geçiş, iyi bir planlama ve aşamalı bir geçiş süreci ile başarılı bir şekilde gerçekleştirilebilir. Bu süreçte, doğru servislerin belirlenmesi, veri yönetiminin planlanması, izleme ve hata yönetimi gibi temel konulara dikkat edilmesi, başarılı bir mikroservis mimarisine geçiş için kritik öneme sahiptir. Geçiş sonrası iyileştirmeler ve izleme süreçleri de mikroservislerin sürdürülebilirliğini artıracaktır.
2.1 Spring Framework ve Spring Boot’a Giriş
Spring Framework, özellikle Java tabanlı uygulamalarda geliştirme sürecini kolaylaştırmak amacıyla tasarlanmış açık kaynaklı bir uygulama geliştirme çerçevesidir. 2002 yılında ilk kez tanıtılan Spring, genişletilebilir modüler yapısıyla Java geliştiricileri için esnek bir ortam sunar. Spring Framework üzerine inşa edilen Spring Boot ise, Spring uygulamalarının hızla geliştirilip dağıtılmasını sağlayan bir araçtır.
Spring Framework’e Giriş
Spring Framework, modüler ve çok yönlü yapısıyla farklı işlevler sunan birkaç temel bileşenden oluşur. En temel özelliklerinden biri olan Dependency Injection (DI), uygulama bileşenlerinin birbirine bağımlılıklarını yönetir. Böylece, kod daha esnek ve test edilebilir hale gelir.
Spring Framework'ün Temel Özellikleri:
- Dependency Injection (Bağımlılık Enjeksiyonu):
- Spring'in temel özelliklerinden biri olan Dependency Injection, bileşenlerin bağımlılıklarını dışarıdan enjekte ederek uygulama modüllerinin daha bağımsız çalışmasını sağlar.
- Bu özellik, nesne oluşturma ve bağımlılık yönetimini merkezileştirir ve kodun test edilebilirliğini artırır.
- Aspect-Oriented Programming (AOP):
- Spring’in AOP desteği, uygulamaya kesme noktaları ekleyerek tekrarlayan işlemleri (logging, security, transaction management) koddan ayrıştırır. Bu, kodun temiz ve yönetilebilir kalmasını sağlar.
- Veri Yönetimi:
- Spring Framework, veri erişimi ve yönetimi için JDBC, Hibernate gibi popüler ORM araçlarıyla entegre çalışır. Spring’in Spring Data modülü, veri tabanı işlemlerini daha basit ve standart bir hale getirir.
- Transaction Management (İşlem Yönetimi):
- Spring, işlem yönetimi için kapsamlı destek sunar. Bu özellik, özellikle kurumsal uygulamalarda kritik olan veri bütünlüğünü ve tutarlılığını korumak için gereklidir.
- Spring MVC (Model-View-Controller):
- Spring MVC, web uygulamaları geliştirmek için güçlü bir çerçeve sağlar. Model, görünüm ve kontrol katmanları arasında net bir ayrım sunarak kodun daha modüler olmasını sağlar.
Spring Boot’a Giriş
Spring Boot, Spring Framework üzerine inşa edilmiş olup, Spring uygulamalarının hızlı ve kolay bir şekilde başlatılması, yapılandırılması ve dağıtılması için geliştirilmiştir. Spring Boot ile uygulama geliştirme sürecindeki karmaşık yapılandırmaları azaltmak ve uygulamayı hızlıca çalışır hale getirmek amaçlanır.
Spring Boot’un Öne Çıkan Özellikleri:
- Auto-Configuration (Otomatik Yapılandırma):
- Spring Boot, uygulamanın gereksinimlerine göre otomatik yapılandırma sunar. Örneğin, Spring Boot veri tabanı bağlantısını, web sunucusunu veya mesajlaşma sistemlerini otomatik olarak yapılandırabilir.
- Bu özellik, geliştiricilerin ayrıntılı XML veya YAML konfigürasyonlarıyla uğraşmasını engeller.
- Embedded Servers (Gömülü Sunucular):
- Spring Boot, Tomcat, Jetty ve Undertow gibi gömülü sunucular ile birlikte gelir. Bu sayede, bir Spring Boot uygulaması bağımsız bir yürütülebilir JAR dosyası olarak çalıştırılabilir.
- Bu özellik, uygulamanın sunucu bağımsız bir şekilde çalışmasını sağlar ve dağıtımı kolaylaştırır.
- Starter Dependencies (Başlatıcı Bağımlılıklar):
- Spring Boot, yaygın kullanılan Spring projeleri için hazır bağımlılık paketleri sunar. Örneğin, spring-boot-starter-web bağımlılığı, Spring MVC tabanlı bir web uygulaması için gerekli tüm bağımlılıkları içerir.
- Bu starter bağımlılıklar, proje kurulumu ve yapılandırmasını basitleştirir.
- Spring Boot CLI (Command Line Interface):
- Spring Boot CLI, Spring Boot uygulamalarını komut satırından hızlıca geliştirmeyi sağlar. Özellikle Groovy dilinde Spring Boot uygulamaları yazarken hızlı bir prototip geliştirme aracı olarak kullanılır.
- Health Monitoring and Actuators (Sağlık İzleme ve Aktüatörler):
- Spring Boot Actuator, uygulamanın çalışma zamanı durumunu izlemek için çeşitli uç noktalar sağlar. Bu uç noktalar, uygulamanın sağlık durumu, metrikleri, konfigürasyon özellikleri gibi bilgileri sunar.
- Özellikle üretim ortamında uygulamaların izlenmesi için çok kullanışlıdır.
- Spring Boot Initializr:
- Spring Boot Initializr, Spring Boot projelerini hızlıca başlatmak için kullanılan bir web aracıdır. Projenin gereksinimlerine göre bağımlılıkları seçerek temel bir yapı oluşturur ve projeyi indirmenizi sağlar.
- Bu araç, proje başlangıcında gerekli ayarları hızla yapmak için idealdir.
Spring Framework ve Spring Boot Arasındaki Farklar
Özellik | Spring Framework | Spring Boot |
Yapılandırma | XML, Java Annotations ile kapsamlı yapılandırma | Otomatik yapılandırma sağlar, yapılandırma minimum |
Sunucu | Harici sunucu kullanılır | Gömülü sunucularla gelir |
Bağımlılık Yönetimi | Detaylı bağımlılık yönetimi gerekir | Starter bağımlılıklar ile basitleştirilmiş |
Çalıştırılabilirlik | Sıkı yapılandırma gerektirir | Tek başına çalışabilen JAR dosyası oluşturur |
Kullanım Amacı | Genişletilebilir ve modüler uygulamalar geliştirme | Hızlı, bağımsız uygulama geliştirme |
Spring Boot ile Geliştirmenin Avantajları
- Hızlı Prototipleme: Spring Boot, Spring uygulamalarını hızla geliştirmenizi ve test etmenizi sağlar. Bu özellik, prototip geliştirme sürecinde özellikle yararlıdır.
- Kolay Konfigürasyon: Spring Boot’un otomatik yapılandırma yetenekleri, yapılandırma karmaşıklığını azaltır ve proje geliştirmeyi kolaylaştırır.
- Çalıştırılabilir Uygulama Paketi: Gömülü sunucu desteği sayesinde, uygulama harici sunucuya ihtiyaç duymadan çalışabilir. Bu, bulut tabanlı mikroservis uygulamaları için özellikle faydalıdır.
- Üretim Hazırlığı: Spring Boot Actuator gibi araçlar, üretim ortamındaki izleme ve sağlık kontrolü ihtiyaçlarını karşılar. Uygulamanın durumu hakkında anlık bilgi sağlayarak hızlı müdahaleye imkan tanır.
Spring Boot, günümüzde mikroservis tabanlı uygulamalar geliştirmek isteyen geliştiriciler için güçlü bir araçtır. Hızlı başlangıç, kolay yapılandırma ve yönetim kolaylıklarıyla, uygulamaların daha sürdürülebilir ve yönetilebilir olmasını sağlar. Spring Framework ve Spring Boot, mikroservis mimarisinde Spring Cloud gibi araçlarla birlikte kullanıldığında, dağıtık sistemler oluşturmak için güçlü bir temel oluşturur.
2.2 Spring Cloud Nedir?
Spring Cloud, mikroservis mimarisi için tasarlanmış bir araç setidir ve Spring Framework üzerine inşa edilmiştir. Mikroservis tabanlı uygulamalar, dağıtık sistemler oldukları için karmaşık yönetim süreçlerine ihtiyaç duyar. Spring Cloud, bu karmaşıklıkları yönetmek için bir dizi modül sunarak mikroservislerin ölçeklenebilir, dayanıklı ve esnek bir şekilde geliştirilmesini sağlar. Spring Cloud, uygulamaların esnekliğini artırırken aynı zamanda geliştiricilere dağıtık sistemlerde gerekli olan temel bileşenleri sağlar.
Spring Cloud’un Temel Özellikleri
- Servis Keşfi ve Kayıt:
- Dağıtık bir ortamda her mikroservisin adresini manuel olarak yönetmek zor olabilir. Spring Cloud, Netflix Eureka gibi servis keşfi araçlarını kullanarak mikroservislerin dinamik olarak kaydedilmesini ve keşfedilmesini sağlar.
- Bu, mikroservislerin birbirlerini kolayca bulmasına yardımcı olur, böylece adres değişikliklerinden etkilenmeden diğer servislerle iletişim kurabilirler.
- Yapılandırma Yönetimi (Spring Cloud Config):
- Spring Cloud Config Server, tüm mikroservisler için merkezi bir yapılandırma sunar. Bu sayede, yapılandırma değişiklikleri anında mikroservislere yansıtılabilir.
- Merkezi yapılandırma sayesinde, tüm servislerin yapılandırma dosyalarını tek bir noktadan yönetmek mümkün olur.
- API Gateway ve Yönlendirme:
- Spring Cloud Gateway, kullanıcı isteklerini doğru mikroservise yönlendiren bir geçit (gateway) sağlar. Gateway, yük dengeleme, hız sınırlama ve güvenlik gibi özellikler sunarak uygulamanın performansını artırır.
- Bu yapı, kullanıcıların tek bir uç noktadan (API Gateway) tüm mikroservislere erişmesini sağlar, ayrıca yetkilendirme ve kimlik doğrulama gibi işlemleri merkezi olarak yönetir.
- Circuit Breaker (Devre Kesici) Desteği:
- Spring Cloud, hizmet kesintilerinden kaynaklanan zincirleme hataları önlemek için devre kesici desenini uygular. Devre kesici, bir mikroservisin yanıt veremediğinde geçici olarak devre dışı bırakılmasını sağlar.
- Bu özellik, dağıtık sistemlerde yaygın olan hataların izole edilmesine yardımcı olarak uygulamanın dayanıklılığını artırır.
- Yük Dengeleme (Load Balancing):
- Spring Cloud, Spring Cloud LoadBalancer ve Ribbon gibi yük dengeleme araçları sunar. Bu sayede, gelen istekler mikroservislerin farklı örnekleri arasında dağıtılarak sistemdeki yük dengelenir.
- Yük dengeleme, özellikle ölçeklenebilirlik açısından önemlidir; sistemdeki tüm servislerin aynı anda verimli bir şekilde çalışmasını sağlar.
- Dağıtık İzleme ve Log Yönetimi:
- Spring Cloud, dağıtık bir ortamda mikroservislerin takibini yapmak için izleme ve log yönetimi araçlarını destekler. Spring Cloud Sleuth ve Zipkin, isteklerin dağıtık sistemdeki akışını izleyerek uygulamanın çalışma sürecini detaylı bir şekilde takip eder.
- Bu özellik, sistemde oluşan hataların ve performans sorunlarının kolayca tespit edilmesini sağlar.
- Mesajlaşma ve Olay Odaklı İletişim (Spring Cloud Stream):
- Spring Cloud Stream, Kafka veya RabbitMQ gibi mesajlaşma platformlarıyla entegre olarak çalışır ve mikroservisler arasında mesaj tabanlı iletişim sağlar. Bu, olay odaklı (event-driven) mimari geliştirmek için kullanılır.
- Mikroservislerin birbirinden bağımsız çalışmasını sağlarken veri paylaşımını etkin bir şekilde yönetir.
- Config Server ve Centralized Configuration:
- Spring Cloud, merkezi yapılandırma yönetimini sağlayan Config Server ile tüm mikroservislerin yapılandırma dosyalarının merkezi bir yerden yönetilmesini sağlar. Bu sayede, her servis kendi yapılandırmasına sahip olabilir, fakat tüm yapılandırmalar tek bir noktadan güncellenebilir.
- Config Server, Git gibi kaynaklardan yapılandırma dosyalarını alarak sürüm takibi yapılmasına da olanak tanır.
Spring Cloud Bileşenleri
- Spring Cloud Netflix: Netflix OSS araçlarını içerir ve Eureka (servis keşfi), Ribbon (yük dengeleme), Hystrix (circuit breaker) ve Zuul (API Gateway) gibi bileşenleri destekler.
- Spring Cloud Config: Mikroservislerin yapılandırmalarını merkezi bir yapılandırma sunucusundan çekmesini sağlar. Bu yapılandırmalar Git gibi bir kaynak kontrol sisteminde saklanabilir.
- Spring Cloud Gateway: Kullanıcı isteklerini mikroservislere yönlendiren bir API Gateway çözümüdür. Ayrıca, güvenlik, hız sınırlama ve yük dengeleme gibi özellikler sunar.
- Spring Cloud Stream: Apache Kafka, RabbitMQ gibi mesajlaşma platformlarıyla entegre olarak çalışır ve mikroservisler arasında olay odaklı iletişim sağlar.
- Spring Cloud Sleuth: Mikroservislerin dağıtık izlenebilirliğini sağlayan bir bileşendir. Sistem içindeki bir isteğin tüm adımlarını takip edebilir, böylece hata ayıklama ve performans izleme işlemleri kolaylaşır.
- Spring Cloud Circuit Breaker: Devre kesici deseni (Circuit Breaker) uygular. Hystrix gibi devre kesici araçlarla entegre olarak çalışır ve sistemde oluşabilecek zincirleme hataları önler.
Spring Cloud’un Mikroservis Mimarisindeki Rolü
Spring Cloud, mikroservislerin esnek, ölçeklenebilir ve güvenli bir şekilde çalışmasını sağlayan temel araçları sunar. Özellikle büyük ve karmaşık sistemlerde, dağıtık bileşenlerin yönetimi, izlenmesi ve birbirleriyle iletişimi Spring Cloud ile daha düzenli ve güvenilir hale getirilir.
- Merkezi Yönetim ve Yapılandırma: Config Server gibi araçlarla yapılandırma merkezi olarak yönetilir.
- Dağıtık İzlenebilirlik ve Log Yönetimi: Sleuth ve Zipkin ile her bir isteğin izlenebilirliği sağlanır.
- Dayanıklılık ve Hata Yönetimi: Circuit Breaker desenleri ile servislerin bağımsız çalışabilirliği artırılır.
- Mesajlaşma Tabanlı İletişim: Stream modülü ile mesaj tabanlı iletişim kurulabilir.
Sonuç
Spring Cloud, dağıtık sistemler ve mikroservisler için özel olarak tasarlanmış güçlü bir araç setidir. Servis keşfi, yük dengeleme, devre kesici, merkezi yapılandırma ve izleme gibi mikroservislerin ihtiyaç duyduğu tüm temel bileşenleri sağlar. Spring Cloud, Spring Boot ile birlikte kullanıldığında, mikroservis tabanlı uygulamaların hızlı, esnek ve sürdürülebilir bir şekilde geliştirilmesini kolaylaştırır. Bu sayede, kompleks dağıtık sistemlerde yönetilebilirlik ve verimlilik sağlanır.
2.3 Spring Cloud Bileşenleri ve Modülleri
Spring Cloud, mikroservis mimarisinde dağıtık sistemleri kolayca geliştirmek, yönetmek ve izlemek için çeşitli modüller ve bileşenler sağlar. Bu bileşenler, mikroservislerin birbirleriyle iletişim kurmasını, yapılandırmalarını merkezi olarak yönetmesini, yük dengelemesini ve izlenebilirliğini sağlar. Spring Cloud’un temel bileşenleri ve modülleri aşağıda açıklanmıştır.
1. Spring Cloud Config (Merkezi Yapılandırma Yönetimi)
Spring Cloud Config, mikroservislerin yapılandırmalarını merkezi bir yapılandırma sunucusundan çekmesini sağlar. Merkezi yapılandırma, mikroservislerin konfigürasyon yönetimini kolaylaştırır ve yapılandırmaların güncellenmesi gerektiğinde tüm servislerin bu değişikliklerden haberdar olmasını sağlar.
- Config Server: Yapılandırma dosyalarının merkezi bir sunucuda saklanmasını ve servislerin bu dosyaları çekmesini sağlar. Git veya bir dosya sistemi üzerinden yapılandırmaları alabilir.
- Config Client: Her mikroservis Config Server’dan yapılandırma ayarlarını çekmek için Config Client’ı kullanır.
2. Spring Cloud Netflix (Netflix OSS Entegrasyonu)
Spring Cloud Netflix, Netflix’in açık kaynak araçlarını entegre ederek mikroservislerin daha dayanıklı, ölçeklenebilir ve yönetilebilir olmasını sağlar. Bu modüller, özellikle servis keşfi, yük dengeleme ve devre kesici gibi özellikler sunar.
- Eureka: Servis keşfi ve kayıt için kullanılır. Mikroservislerin IP adresleri ve bağlantı noktaları sürekli değişebildiğinden, Eureka ile servislerin birbirini dinamik olarak bulması sağlanır.
- Ribbon: Yük dengeleme sağlar. Mikroservisler arasındaki isteklerin eşit bir şekilde dağıtılmasına yardımcı olur.
- Hystrix: Devre kesici (Circuit Breaker) desenini uygular. Mikroservislerden birinin arızalanması durumunda bu servisin çağrılarını geçici olarak durdurarak diğer servisleri korur.
- Zuul: API Gateway olarak kullanılır ve gelen kullanıcı isteklerini ilgili mikroservise yönlendirir. Ayrıca, güvenlik ve hız sınırlama gibi işlemleri yönetir.
3. Spring Cloud Gateway (API Yönlendirme)
Spring Cloud Gateway, Zuul'un yerine geliştirilmiş bir API Gateway çözümüdür ve daha modern özellikler sunar. Kullanıcı isteklerini ilgili mikroservise yönlendirir, güvenlik, yük dengeleme, hız sınırlama ve izleme gibi işlevler sağlar.
- Routing: Gelen istekleri, istek yollarına veya diğer kriterlere göre mikroservislere yönlendirir.
- Filter Chain: İstekler üzerinde çeşitli filtreler çalıştırabilir. Bu filtreler, güvenlik denetimleri veya hız sınırlama gibi özellikler için kullanılabilir.
- Load Balancing: Yük dengeleme yaparak, gelen isteklerin çeşitli mikroservis örneklerine dağıtılmasını sağlar.
4. Spring Cloud Circuit Breaker (Dayanıklılık)
Spring Cloud Circuit Breaker, bir servisin yanıt vermemesi veya hata vermesi durumunda devre kesici desenini uygular. Bu desen, sistemin dayanıklılığını artırarak zincirleme hataları önler. Circuit Breaker, Spring Boot uygulamaları için kolay entegrasyon sağlar ve özellikle servisler arasındaki hata yönetimini basitleştirir.
- Fallback: Devre kesildiğinde, hatalı servisin yerine alternatif bir işlem yapılmasını sağlar.
- Hystrix ve Resilience4j Desteği: Circuit Breaker, Spring Cloud Netflix ile birlikte Hystrix veya Resilience4j gibi dayanıklılık araçlarını destekler.
5. Spring Cloud Sleuth (Dağıtık İzlenebilirlik)
Spring Cloud Sleuth, dağıtık sistemlerde izleme ve hata ayıklama sürecini kolaylaştırır. Sleuth, bir isteğin sistem içinde izlenebilmesi için her isteğe benzersiz bir izleme kimliği ekler ve bu kimlik sayesinde bir isteğin tüm adımları takip edilebilir.
- Trace ID ve Span ID: Her isteğe özel bir trace ID ve isteğin her bir adımına özel bir span ID ekler.
- Zipkin Entegrasyonu: Zipkin ile entegre edilerek, isteğin tüm yolculuğu detaylı bir şekilde izlenebilir ve performans sorunları tespit edilebilir.
6. Spring Cloud Stream (Mesaj Tabanlı İletişim)
Spring Cloud Stream, mikroservislerin mesaj tabanlı iletişim kurmasını sağlayan bir modüldür. Apache Kafka, RabbitMQ gibi mesajlaşma platformlarıyla entegre olarak, mikroservisler arasında olay tabanlı iletişim sağlanır.
- Binder: Mesajlaşma sistemi (Kafka, RabbitMQ) ile Spring Cloud Stream arasında köprü görevi görür.
- Event-Driven Architecture: Olay tabanlı mimari oluşturarak, bağımsız mikroservislerin birbirine veri göndermesini sağlar.
- Fault Tolerance: Mesaj kaybı veya iletim hatalarına karşı dayanıklılık sağlar.
7. Spring Cloud Bus (Merkezi Yapılandırma ve Olay Yönetimi)
Spring Cloud Bus, mikroservisler arasında mesajlaşma yoluyla yapılandırma değişikliklerini senkronize eder. Config Server üzerinde yapılan yapılandırma değişiklikleri anında tüm mikroservislere yayılabilir.
- Config Refresh: Config Server’da yapılan değişikliklerin tüm servislere otomatik olarak yansımasını sağlar.
- Event Broadcasting: Mikroservisler arasında olay tabanlı mesajlaşmayı sağlar, böylece merkezi yapılandırma değişiklikleri veya olaylar tüm mikroservislerle senkronize edilir.
8. Spring Cloud Security (Güvenlik)
Spring Cloud Security, mikroservisler için güvenlik çözümleri sunar. Özellikle kullanıcı kimlik doğrulama ve yetkilendirme süreçlerinde OAuth2 gibi standartları kullanarak güvenli bir yapı sağlar.
- OAuth2 Desteği: Mikroservisler için merkezi kimlik doğrulama ve yetkilendirme sağlar.
- Token Management: Her mikroservisin kimlik doğrulama işlemlerini merkezi bir güvenlik sunucusuna yönlendirmesini sağlar.
9. Spring Cloud Kubernetes (Konteyner Orkestrasyonu)
Spring Cloud Kubernetes, Kubernetes üzerinde çalışan Spring Boot uygulamaları için özel entegrasyonlar sağlar. Kubernetes’te çalışan mikroservislerin servis keşfi, yapılandırma ve güvenlik gibi özelliklerini yönetmek için kullanılır.
- Kubernetes Config Maps ve Secrets: Kubernetes içinde merkezi yapılandırma ve güvenlik bilgilerini yönetir.
- Kubernetes Discovery: Kubernetes servis keşfi ile mikroservislerin otomatik olarak birbirini bulmasını sağlar.
Spring Cloud Modüllerinin Genel Tablosu
Modül | İşlevi |
Spring Cloud Config | Merkezi yapılandırma yönetimi |
Spring Cloud Netflix | Servis keşfi, yük dengeleme, devre kesici |
Spring Cloud Gateway | API yönlendirme ve güvenlik |
Spring Cloud Circuit Breaker | Hata izolasyonu ve dayanıklılık |
Spring Cloud Sleuth | Dağıtık izlenebilirlik ve izleme |
Spring Cloud Stream | Mesaj tabanlı iletişim ve olay odaklı mimari |
Spring Cloud Bus | Yapılandırma senkronizasyonu ve olay yönetimi |
Spring Cloud Security | Güvenlik ve kimlik doğrulama |
Spring Cloud Kubernetes | Kubernetes ile konteyner orkestrasyonu |
Sonuç
Spring Cloud, mikroservis tabanlı uygulamalar geliştirmek için gereken tüm bileşenleri ve modülleri sunarak, mikroservislerin ölçeklenebilir, esnek ve dayanıklı olmasını sağlar. Servis keşfi, merkezi yapılandırma yönetimi, devre kesici, yük dengeleme, güvenlik, mesajlaşma ve izleme gibi mikroservislerin temel ihtiyaçlarını karşılar. Spring Cloud’un bu geniş modül yelpazesi, özellikle dağıtık sistemlerin yönetimini ve sürdürülebilirliğini artırır.
3.1 Eureka Server ile Servis Keşfi
Eureka, Netflix tarafından geliştirilmiş bir servis keşif sunucusudur ve Spring Cloud Netflix modülü ile entegre olarak kullanılır. Mikroservis mimarisinde, her mikroservisin IP adresi veya bağlantı noktası sık sık değişebildiği için, servislerin birbirlerini dinamik olarak bulması gerekir. Eureka Server, bu ihtiyacı karşılayarak servislerin merkezi bir sunucuda kayıt edilmesini ve keşfedilmesini sağlar.
Eureka Server Nedir?
Eureka Server, mikroservislerin IP adreslerini ve bağlantı noktalarını kaydeden ve bu bilgileri diğer mikroservislere sunan bir servis keşif sunucusudur. Eureka Server’a kayıt olan her bir mikroservis, kendi ağ adresini ve durum bilgisini sunucuya bildirir. Diğer mikroservisler de ihtiyaç duydukları servisi bulmak için Eureka Server’a başvurur ve böylece birbirlerinin adreslerini doğrudan bilmek zorunda kalmazlar.
Eureka Server'ın Temel Bileşenleri
- Service Registry (Servis Kaydı):
- Eureka Server, servislerin adreslerini (IP ve port) ve durum bilgilerini kaydeder. Bu kayıt, tüm servislerin nerede bulunduklarını bilmesini sağlar.
- Servisler, belirli aralıklarla kendi adreslerini ve sağlık durumlarını güncelleyerek bu kayıtların doğruluğunu sağlar.
- Service Discovery (Servis Keşfi):
- Mikroservisler, ihtiyaç duydukları diğer servisleri Eureka üzerinden dinamik olarak bulabilir. Bu keşif işlemi, mikroservislerin IP adreslerini manuel olarak bilmesini gerektirmediği için esneklik sağlar.
- Heartbeat (Kalp Atışı):
- Her mikroservis, belirli aralıklarla Eureka Server’a bir “heartbeat” mesajı göndererek sistemde çalışır durumda olduğunu bildirir. Eğer Eureka Server bu sinyali belirli bir süre almazsa, ilgili servisi kayıt defterinden siler ve diğer mikroservislere bu servisin artık erişilebilir olmadığını bildirir.
Eureka Server ile Çalışma Prensibi
- Servisin Kayıt Olması (Service Registration):
- Mikroservisler, başlatıldıklarında Eureka Server’a kayıt olur. Bu süreçte servis kendi adını, IP adresini, bağlantı noktasını ve sağlık durumunu Eureka’ya bildirir.
- Kayıt işlemi tamamlandığında, diğer servisler bu servisi Eureka üzerinden bulabilir hale gelir.
- Servisin Keşfedilmesi (Service Discovery):
- Bir mikroservis, diğer bir servisin adresine ihtiyaç duyduğunda Eureka Client aracılığıyla Eureka Server’a başvurur. Eureka Server, talep edilen servisin adresini döner ve bu adres üzerinden iletişim kurulur.
- Örneğin, bir ödeme servisi (payment-service) kullanıcı servisine (user-service) bağlanmak istediğinde, Eureka Server’a başvurarak user-service’in adresini öğrenir ve bağlantı kurar.
- Servislerin Sağlık Durumunun İzlenmesi (Health Check):
- Mikroservisler belirli aralıklarla Eureka Server’a kalp atışı sinyali gönderir. Bu, ilgili servisin halen çalışır durumda olduğunu bildirir.
- Eğer bir servis belirli bir süre boyunca Eureka Server’a sinyal göndermezse, Eureka Server bu servisin artık erişilebilir olmadığını varsayarak kaydını pasif hale getirir veya siler.
Eureka Server ve Eureka Client Kurulumu
- Eureka Server Kurulumu:
- Spring Boot tabanlı bir Eureka Server kurmak için, Spring Boot projesinde spring-cloud-starter-netflix-eureka-server bağımlılığı eklenir.
- Ana sınıfta (Application class) @EnableEurekaServer ifadesi eklenir. Bu anotasyon, uygulamayı bir Eureka Server olarak başlatır.
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
- application.yml dosyasında temel Eureka Server yapılandırması yapılır:
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
- Eureka Client Kurulumu:
- Eureka Client, mikroservislerin Eureka Server’a kayıt olmasını sağlar. Her bir mikroservis, spring-cloud-starter-netflix-eureka-client bağımlılığı eklenerek Eureka Client haline getirilir.
- application.yml dosyasında Eureka Server adresi belirtilir:
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
- Mikroservis, başlatıldığında otomatik olarak Eureka Server’a kaydolur ve servis keşfi için hazır hale gelir.
Eureka Server'ın Avantajları
- Dinamik Servis Keşfi:
- Eureka Server, mikroservislerin birbirlerini dinamik olarak bulmasını sağlar. Bu, IP adreslerinin değişmesi durumunda bile kesintisiz bir iletişim sağlar.
- Otomatik Servis Kayıt ve Yönetimi:
- Her mikroservis otomatik olarak Eureka Server’a kayıt olur ve durumu hakkında düzenli bilgi verir. Bu, servis yönetimini kolaylaştırır ve güncel bir servis kaydı sağlar.
- Yüksek Erişilebilirlik (High Availability):
- Eureka Server, klonlanarak birden fazla örnekte çalışabilir ve bu sayede kesintisiz erişilebilirlik sağlanır. Bu, sistemin dayanıklılığını artırır.
- Failover ve Dayanıklılık:
- Eureka Server, bir servisin çalışmadığını tespit ettiğinde, diğer servisleri bu durumdan haberdar ederek sistemin hata durumunda dayanıklılığını artırır.
Eureka Server’ın Dezavantajları
- Ekstra Bağımlılık ve Yapılandırma:
- Eureka Server, mikroservis mimarisinde ek bir bileşen olarak yapılandırılmalı ve yönetilmelidir, bu da sistemin karmaşıklığını artırabilir.
- Network Trafiği:
- Mikroservisler arasında sürekli iletişim olduğundan, Eureka Server ile olan trafik yoğunluğu artabilir. Büyük sistemlerde network üzerindeki bu yük yönetilmelidir.
- Tek Nokta Arızası (Single Point of Failure):
- Eğer Eureka Server yalnızca bir örnek üzerinde çalışıyorsa, bu durumda Eureka Server arızalanırsa tüm sistem etkilenebilir. Bu nedenle, Eureka Server’ın yüksek erişilebilirlik sağlamak için yedekli çalıştırılması önemlidir.
Sonuç
Eureka Server, mikroservislerin dinamik olarak birbirlerini bulmasını sağlayan güçlü bir servis keşif aracıdır. Mikroservislerin IP adresleri ve bağlantı noktaları sürekli değişebileceği için, Eureka Server servisler arasındaki bu karmaşıklığı yönetir ve iletişimi kolaylaştırır. Eureka Server, özellikle büyük ve dinamik mikroservis mimarilerinde servis keşfi ve dayanıklılık açısından büyük avantaj sağlar.
3.2 Spring Cloud Gateway ile API Yönlendirme
Spring Cloud Gateway, modern bir API Gateway çözümü sunarak mikroservisler arasındaki yönlendirme işlemlerini ve güvenlik, hız sınırlama gibi yönetim özelliklerini kolaylaştırır. Spring Cloud Netflix’in bir parçası olan Zuul'un yerine geliştirilmiştir ve daha yüksek performans, daha kolay yapılandırma ve daha geniş özellikler sunar. Spring Cloud Gateway, kullanıcı isteklerini doğru mikroservise yönlendirmekle kalmaz, aynı zamanda güvenlik, yük dengeleme, hız sınırlama ve izleme gibi önemli işlevler sağlar.
Spring Cloud Gateway’in Özellikleri
- Routing (Yönlendirme):
- Gateway, kullanıcı isteklerini belirli kurallara göre (URL yoluna, HTTP başlıklarına, sorgu parametrelerine göre) ilgili mikroservislere yönlendirebilir.
- Yönlendirme kuralları esnek ve dinamik olarak yapılandırılabilir, böylece tüm mikroservislere tek bir uç noktadan erişim sağlanır.
- Filter Chain (Filtre Zinciri):
- Spring Cloud Gateway, istekler ve yanıtlar üzerinde çeşitli filtrelerin çalıştırılmasına olanak tanır. Bu filtreler, istek başlıklarını değiştirme, doğrulama yapma, yanıtları düzenleme gibi işlemleri gerçekleştirebilir.
- Örneğin, bir filtre ile gelen isteklerde güvenlik denetimleri yapılabilir veya belirli bir yanıt süresi sınırını aşan istekler reddedilebilir.
- Load Balancing (Yük Dengeleme):
- Gateway, mikroservisler arasında yük dengeleme işlemini gerçekleştirerek gelen isteklerin yükünü birden fazla mikroservis örneğine dağıtır. Bu, sistemin performansını artırır ve kesintisiz erişim sağlar.
- Spring Cloud LoadBalancer ile entegrasyon sayesinde, yük dengeleme işlemi otomatik olarak yapılabilir.
- Path Rewriting (Yol Yeniden Yazma):
- Spring Cloud Gateway, isteklerin URL’lerini yeniden yazma yeteneğine sahiptir. Örneğin, dış dünyaya /api/orders gibi görünen bir URL’yi iç sistemdeki /orders-service/api adresine yönlendirebilir.
- Bu özellik, dış dünyadan gelen isteklerin iç mikroservislere uygun hale getirilmesini sağlar.
- Security (Güvenlik):
- Spring Cloud Gateway, kimlik doğrulama ve yetkilendirme işlemlerini merkezi olarak yönetebilir. OAuth2 gibi standart kimlik doğrulama protokolleri ile entegre edilerek mikroservislere gelen isteklerde güvenlik sağlar.
- Bu, tüm kimlik doğrulama süreçlerinin tek bir noktadan yönetilmesine imkan tanır.
- Rate Limiting (Hız Sınırlama):
- Gateway, belirli bir IP adresine veya kullanıcıya yapılan istekleri sınırlandırarak hız sınırlama işlemi yapabilir. Bu özellik, kötü amaçlı isteklerden veya aşırı yüklenmeden koruma sağlar.
- Örneğin, bir kullanıcı belirli bir süre içinde belirli sayıda istekte bulunabilir, fazlası reddedilir.
- Monitoring and Metrics (İzleme ve Metrikler):
- Spring Cloud Gateway, gelen isteklerin takibini yaparak metrikler sağlar. Bu metrikler, sistemdeki trafik yoğunluğu, yanıt süreleri ve hatalı istekler gibi bilgileri içerir.
- Özellikle üretim ortamında, bu tür veriler performans ve güvenilirliği artırmak için kullanılabilir.
Spring Cloud Gateway Kurulumu ve Yapılandırması
- Gateway Projesi Oluşturma:
- Spring Initializr kullanılarak spring-cloud-starter-gateway bağımlılığı ile bir Spring Boot projesi oluşturulur.
- Proje, Spring Boot ve Spring Cloud Gateway bileşenleri ile yapılandırılır.
- Gateway Yapılandırması:
- application.yml dosyasında, yönlendirme kuralları (route) ve filtreler tanımlanır. Örneğin, /api/orders yolunu orders-service adlı mikroservise yönlendirmek için aşağıdaki gibi bir yapılandırma yapılabilir:
spring:
cloud:
gateway:
routes:
- id: orders-service-route
uri: lb://orders-service
predicates:
- Path=/api/orders/**
filters:
- RewritePath=/api/orders/(?<segment>.*), /$\\{segment}
- Bu örnekte:
- id: Yönlendirme kuralına verilen isimdir.
- uri: İsteğin yönlendirileceği mikroservisin adresidir (lb:// ifadesi, Spring Cloud LoadBalancer ile yük dengeleme yapılacağını belirtir).
- predicates: İsteğin belirli bir yol ile başlayıp başlamadığını kontrol eder. Burada /api/orders/** yolundaki tüm istekler yönlendirilir.
- filters: İsteklerin URL’lerini yeniden yazmak veya başlıkları değiştirmek gibi işlemler için kullanılır.
- Filtrelerin Kullanımı:
- Filtreler, istek ve yanıt üzerinde çeşitli işlemler yapmak için kullanılabilir. Örneğin, AddRequestHeader filtresi ile tüm isteklere özel bir başlık eklenebilir:
filters:
- AddRequestHeader=X-Request-Source, SpringCloudGateway
- Bu yapılandırma, her isteğe X-Request-Source: SpringCloudGateway başlığı ekler. Böylece, mikroservisler isteklerin Gateway üzerinden geldiğini bilebilir.
Spring Cloud Gateway’in Avantajları
- Merkezi Yönlendirme Yönetimi:
- Tüm isteklerin Gateway üzerinden geçmesi, yönlendirme işlemlerini merkezi bir noktadan yönetme imkanı tanır. Bu, mikroservislerin URL değişikliklerinden bağımsız çalışabilmesini sağlar.
- Kolay Güvenlik Yönetimi:
- Kimlik doğrulama ve yetkilendirme işlemleri Gateway’de yapılabilir. Böylece, her mikroservisin ayrı ayrı güvenlik yönetmesi gerekmez ve güvenlik merkezi bir noktadan kontrol edilebilir.
- Dinamik Filtreleme ve Yönlendirme:
- Spring Cloud Gateway, dinamik filtreleme ve yönlendirme işlemlerini kolayca yapılandırma olanağı tanır. Bu, uygulamanın esnek ve hızlı bir şekilde yönetilmesini sağlar.
- Yüksek Performans:
- Spring Cloud Gateway, performans odaklı bir çözüm sunar. Reactor Netty gibi reaktif altyapılar üzerine inşa edildiği için yüksek performanslı ve düşük gecikmeli yönlendirme sağlar.
- Esneklik ve Ölçeklenebilirlik:
- Yönlendirme kurallarının esnek yapısı sayesinde, uygulamanın gereksinimlerine göre kolayca yeni mikroservisler eklenebilir veya mevcut yönlendirme kuralları düzenlenebilir.
Spring Cloud Gateway ve Zuul Karşılaştırması
Özellik | Spring Cloud Gateway | Zuul |
Yapı | Reaktif (Reactor Netty ile) | Bloklama tabanlı |
Performans | Daha yüksek performans ve düşük gecikme | Daha düşük performans |
Filter Chain | Esnek ve daha modern filtreleme | Sınırlı filtre yapısı |
Yük Dengeleme | Spring Cloud LoadBalancer ile entegre | Netflix Ribbon ile entegre |
Güvenlik | OAuth2 desteği ve güvenlik filtreleri | Sınırlı güvenlik desteği |
Özelleştirilebilirlik | Yüksek, genişletilebilir filtre ve yönlendirme yapısı | Daha sınırlı özelleştirme |
Spring Cloud Gateway’in Mikroservis Mimarisindeki Rolü
Spring Cloud Gateway, mikroservis mimarisinde API yönlendirme, güvenlik, yük dengeleme ve hız sınırlama gibi temel işlevleri merkezi bir noktadan sağlar. Mikroservislerin arka planda çalışırken dış dünya ile nasıl etkileşime gireceğini yönetir. Gateway, bir ağ geçidi (gateway) olarak kullanıcı isteklerini karşılar, ilgili mikroservislere yönlendirir ve mikroservislerin dış dünyadan soyutlanmasını sağlar.
Spring Cloud Gateway ile mikroservis mimarisinde şu avantajlar elde edilir:
- Merkezi Güvenlik ve Yetkilendirme Yönetimi
- Kolayca Yönetilebilir Yönlendirme Kuralları
- Esnek Filtreleme ve İstek/Yanıt Manipülasyonu
- Daha Az Karmaşa ile Yüksek Ölçeklenebilirlik
Sonuç
Spring Cloud Gateway, API yönlendirme, güvenlik ve hız sınırlama gibi özelliklerle mikroservislerin dış dünya ile nasıl etkileşim kuracağını belirler. Modern, reaktif yapısı sayesinde yüksek performans sunar ve esnek filtreleme seçenekleri ile dağıtık sistemlerin yönetimini kolaylaştırır. Spring Cloud Gateway, mikroservis mim
3.3 Yük Dengeleme ve Yüksek Erişilebilirlik
Mikroservis mimarisinde, kullanıcı isteklerinin yoğun olduğu zamanlarda sistemin performansını korumak ve kesintisiz erişim sağlamak çok önemlidir. Yük dengeleme (load balancing) ve yüksek erişilebilirlik (high availability), dağıtık sistemlerde bu amaçları gerçekleştirmek için kullanılan iki ana tekniktir. Yük dengeleme, gelen istekleri sistemdeki farklı mikroservis örnekleri arasında dağıtarak sistemin verimli çalışmasını sağlar. Yüksek erişilebilirlik ise sistemin hata toleransını artırarak kesintisiz hizmet sunmasını garanti eder.
Yük Dengeleme Nedir?
Yük dengeleme, bir sistemdeki iş yükünü birden fazla mikroservis veya sunucu örneği arasında dağıtma işlemidir. Böylece tek bir servis veya sunucu yoğunluktan dolayı aşırı yüklenmez ve sistem performansında düşüş yaşanmaz. Yük dengeleme işlemi, hem kullanıcı deneyimini iyileştirir hem de sistemdeki kaynakların verimli kullanılmasını sağlar.
Yük dengeleme, iki ana yöntemle yapılır:
- Sunucu Tarafı Yük Dengeleme:
- Sistem içindeki bir yük dengeleyici sunucu (örneğin, bir donanım veya yazılım yük dengeleyici) gelen istekleri çeşitli mikroservis örneklerine dağıtır.
- Bu yaklaşımda, yük dengeleme işlemi tamamen sunucu tarafından yönetilir ve istemci yük dengeleyiciyi bilmez.
- İstemci Tarafı Yük Dengeleme:
- Mikroservis istemcileri, sistemdeki tüm servis örneklerinin adreslerini bilir ve doğrudan bu örnekler arasında yük dengeleme işlemini yapar.
- Örneğin, Netflix Ribbon gibi istemci tabanlı yük dengeleme araçları, mikroservislerin hangi örneğe istek göndereceğini belirler.
Spring Cloud ile Yük Dengeleme
Spring Cloud, özellikle istemci tarafı yük dengeleme için bazı araçlar sunar. Spring Cloud LoadBalancer ve Netflix Ribbon gibi araçlar, Spring Cloud uygulamalarında yaygın olarak kullanılır.
- Spring Cloud LoadBalancer:
- Spring Cloud LoadBalancer, Spring Boot 2.4 sürümünden itibaren Ribbon’un yerini alan istemci tarafı yük dengeleme aracıdır. Servis isteklerini mevcut mikroservis örnekleri arasında dağıtır.
- Spring Cloud LoadBalancer, mikroservislerin dinamik olarak ölçeklenmesine izin verir ve yüksek erişilebilirlik sağlar.
Örnek Yapılandırma:
spring:
cloud:
loadbalancer:
retry: true
- Netflix Ribbon (Önceden Kullanılan):
- Ribbon, Netflix tarafından geliştirilmiş istemci tarafı bir yük dengeleme aracıdır. Spring Cloud Netflix modülü ile entegre olarak kullanılabilir.
- Ribbon, mikroservislerin her bir örneği arasında yük dengeleme yaparak istekleri dağıtır.
Örnek Yapılandırma:
service-name:
ribbon:
eureka:
enabled: true
listOfServers: localhost:8081, localhost:8082
ConnectTimeout: 3000
ReadTimeout: 3000
Yüksek Erişilebilirlik Nedir?
Yüksek erişilebilirlik, sistemin olası hata durumlarında kesintisiz hizmet sunabilme yeteneğidir. Yüksek erişilebilir bir sistemde, sunucu veya servis arızaları durumunda kullanıcıların etkilenmemesi için çeşitli önlemler alınır. Bu, genellikle bir fazlalık (redundancy) sağlama, hata tespiti ve hata giderme mekanizmaları ile gerçekleştirilir.
Yüksek erişilebilirlik için temel yöntemler şunlardır:
- Servis Fazlalığı (Redundancy):
- Her mikroservisten birden fazla örnek çalıştırarak, bir örneğin çökmesi durumunda diğer örneklerin devreye girmesi sağlanır.
- Örneğin, üç örnek çalıştırarak tek bir örneğin çökmesi durumunda sistemin hala %66 kapasite ile çalışması sağlanabilir.
- Failover Mekanizmaları:
- Bir servis veya sunucu başarısız olduğunda, sistemin başka bir örneğe otomatik olarak yönlendirilmesini sağlar. Bu, kullanıcıların kesintisiz hizmet almasını sağlar.
- Örneğin, yük dengeleyici bir örnek başarısız olduğunda istekleri otomatik olarak başka bir örneğe yönlendirebilir.
- Veri Yedekleme ve Replikasyon:
- Veri kaybını önlemek ve veri sürekliliğini sağlamak için, veriler birden fazla sunucuda yedeklenir veya çoğaltılır. Bu yöntem, veri tabanlarının yüksek erişilebilirliğini sağlar.
- Örneğin, MongoDB gibi dağıtık veritabanları replikasyon sağlayarak veri kaybını önler.
- Konteyner Orkestrasyonu (Kubernetes):
- Kubernetes gibi konteyner orkestrasyon araçları, mikroservis örneklerini otomatik olarak yönetir, ölçekler ve arızalı bir örneği otomatik olarak yeniden başlatır.
- Kubernetes, yük dengeleme, failover ve yüksek erişilebilirlik sağlamak için ideal bir çözümdür.
Spring Cloud Yük Dengeleme ve Yüksek Erişilebilirlik Yapılandırması
Spring Cloud uygulamalarında yük dengeleme ve yüksek erişilebilirlik için temel yapılandırma ayarları aşağıdaki gibidir:
- Eureka ile Servis Kayıt ve Keşfi:
- Eureka Server, servislerin dinamik olarak kaydedilmesini ve keşfedilmesini sağlar. Yük dengeleyici, Eureka’dan aldığı bilgileri kullanarak yük dağıtımı yapar.
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
- Spring Cloud LoadBalancer:
- Spring Cloud LoadBalancer, Eureka veya Kubernetes gibi bir servis keşif sistemi ile birlikte çalışarak istekleri çeşitli örnekler arasında dağıtır. Özellikle, mikroservislerin doğru ve güncel örneklere yönlendirilmesini sağlar.
spring:
cloud:
loadbalancer:
retry: true
- Circuit Breaker ile Hata İzolasyonu:
- Yüksek erişilebilirliği artırmak için, Circuit Breaker kullanarak bir servis arızalandığında isteklerin o servise yönlendirilmesi geçici olarak durdurulabilir. Bu, tüm sistemin arızalanmasını önler.
- Spring Cloud Circuit Breaker modülü ile Hystrix veya Resilience4j gibi araçlar kullanılarak devre kesici özelliği eklenebilir.
- Konteyner Orkestrasyonu ile Yüksek Erişilebilirlik:
- Docker ve Kubernetes gibi konteynerleştirme ve orkestrasyon araçları kullanılarak mikroservislerin yedekli çalıştırılması sağlanabilir. Bu, yüksek erişilebilirliği garantiler.
Yük Dengeleme ve Yüksek Erişilebilirliğin Avantajları
- Performans Artışı:
- Yük dengeleme, sistemdeki her mikroservis örneğinin optimum düzeyde çalışmasını sağlar. Bu, kullanıcıların daha hızlı yanıt almasına ve sistemin performansının artmasına yol açar.
- Kesintisiz Hizmet:
- Yüksek erişilebilirlik sayesinde sistem bir veya birkaç mikroservis örneği çökse bile çalışmaya devam eder. Bu, kullanıcıların kesintisiz hizmet almasını sağlar.
- Ölçeklenebilirlik:
- Yük dengeleyiciler, gelen trafiği farklı örnekler arasında dağıtarak sistemin yatay olarak ölçeklenmesini sağlar. Artan trafiğe hızlı bir şekilde yanıt verebilmek için yeni örnekler eklenebilir.
- Esneklik ve Hata Toleransı:
- Yüksek erişilebilirlik ve failover mekanizmaları, sistemin hata toleransını artırır ve bir hata durumunda sistemin hemen toparlanmasını sağlar.
Sonuç
Yük dengeleme ve yüksek erişilebilirlik, mikroservis mimarisinde kritik öneme sahip iki özelliktir. Spring Cloud LoadBalancer gibi araçlar ile yük dengeleme sağlanabilirken, Eureka gibi servis keşif araçları, mikroservislerin dinamik olarak birbirini bulmasını sağlar. Yüksek erişilebilirlik sağlamak için, failover mekanizmaları, veri replikasyonu ve Kubernetes gibi konteyner orkestrasyon araçları kullanılabilir. Bu yapı, mikroservislerin daha dayanıklı, ölçeklenebilir ve kesintisiz bir şekilde çalışmasını sağlar.
Feign Client, Spring Cloud tarafından sağlanan ve mikroservislerin REST API’leri arasında kolayca iletişim kurmasını sağlayan bir HTTP istemci kütüphanesidir. Feign, mikroservislerin API çağrılarını Java arayüzleri üzerinden gerçekleştirmesine olanak tanır, böylece kodu daha temiz ve anlaşılır hale getirir. Feign ayrıca Eureka gibi servis keşfi araçlarıyla entegre olarak, mikroservislerin birbirlerini bulmasını ve çağrı yapmasını sağlar.
Aşağıda Feign Client’in nasıl kurulacağı ve kullanılacağına dair detaylı bir rehber bulunmaktadır:
————————
1. Feign Client’in Avantajları
- Basit ve Temiz API Çağrıları: Feign ile REST API çağrılarını Java arayüzleri üzerinden yapabilirsiniz, böylece HTTP istemci kodları daha okunabilir ve sade olur.
- Yüksek Entegrasyon: Feign, Eureka gibi servis keşfi araçları ve Ribbon gibi yük dengeleme araçlarıyla entegre çalışabilir.
- Yeniden Kullanılabilir Kod: Feign Client sayesinde aynı servise yapılan API çağrıları tek bir arayüzde toplanabilir, bu da kodun yeniden kullanılabilirliğini artırır.
- Error Decoder: Feign’in sunduğu ErrorDecoder ile özel hata yönetimi yapabilirsiniz.
- Kolay Test Edilebilirlik: Feign Client arayüzleri, mock’lanabilir ve kolayca test edilebilir.
————————
2. Feign Client Kurulumu
Adım 1: Feign Bağımlılığını Ekleyin
Feign’i Spring Boot projenize eklemek için pom.xml dosyasına Spring Cloud OpenFeign bağımlılığını ekleyin:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Adım 2: Feign Client’i Etkinleştirin
Ana uygulama sınıfınıza @EnableFeignClients anotasyonunu ekleyerek Feign Client desteğini etkinleştirin:
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableFeignClients
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
————————
3. Feign Client Kullanımı
Feign Client ile bir REST API çağrısı yapmak için bir arayüz tanımlayın ve bu arayüzü @FeignClient anotasyonu ile işaretleyin. Örneğin, bir kullanıcı servisine çağrı yapmak için bir Feign Client tanımlayalım:
Adım 3.1: Feign Client Arayüzü Oluşturun
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "user-service")
public interface UserClient {
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") Long id);
}
Burada:
- @FeignClient(name = "user-service"): user-service adında bir mikroservise çağrı yapılmasını sağlar. Eğer Eureka gibi bir servis keşfi aracı kullanıyorsanız, Feign Client bu adı kullanarak user-service mikroservisini bulacaktır.
- @GetMapping("/users/{id}"): Kullanıcı servisine GET isteği ile /users/{id} endpoint’ine erişim sağlar.
Adım 3.2: Feign Client’i Serviste Kullanma
Tanımladığınız Feign Client’i bir Spring servisine enjekte ederek kullanabilirsiniz:
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserClient userClient;
public UserService(UserClient userClient) {
this.userClient = userClient;
}
public User getUser(Long id) {
return userClient.getUserById(id);
}
}
Bu örnekte UserService, UserClient aracılığıyla user-service mikroservisine bir API çağrısı yapmaktadır.
————————
4. Feign Client ile Özelleştirilmiş Yapılandırmalar
4.1 Yük Dengeleme ve Servis Keşfi ile Feign Client
Eureka veya Consul gibi servis keşfi araçlarını kullanıyorsanız, Feign Client servis adını kullanarak otomatik olarak yük dengeleme yapabilir.
- application.yml veya application.properties dosyanıza aşağıdaki satırları ekleyerek Eureka servis keşfi ve yük dengeleme desteğini etkinleştirin:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
Bu sayede, Feign Client user-service adıyla Eureka’daki kayıtlardan ilgili servisi bulup çağrı yapacaktır.
4.2 Feign Client Timeout Ayarları
Feign Client için özel timeout ayarları belirleyebilirsiniz:
feign:
client:
config:
default:
connectTimeout: 5000 # 5 saniye bağlantı süresi
readTimeout: 10000 # 10 saniye okuma süresi
4.3 Error Decoder ile Hata Yönetimi
Özel hata yönetimi için Feign’in ErrorDecoder sınıfını kullanabilirsiniz. Örneğin:
import feign.Response;
import feign.codec.ErrorDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FeignConfig {
@Bean
public ErrorDecoder errorDecoder() {
return new CustomErrorDecoder();
}
}
class CustomErrorDecoder implements ErrorDecoder {
@Override
public Exception decode(String methodKey, Response response) {
switch (response.status()) {
case 400:
return new BadRequestException("Bad Request");
case 404:
return new NotFoundException("Not Found");
default:
return new Exception("Generic error");
}
}
}
Bu yapılandırmada, Feign Client belirli hata kodlarına özel durumlar fırlatacaktır.
————————
5. Feign Client ile Yüksek Performans ve Dayanıklılık
Feign Client, mikroservisler arasındaki çağrılarda performansı ve dayanıklılığı artırmak için Retryer ve Circuit Breaker gibi dayanıklılık özellikleriyle yapılandırılabilir.
5.1 Retryer ile Tekrar Deneme (Retry)
Bazı hatalarda yeniden deneme yapmak için Feign’in Retryer sınıfını kullanabilirsiniz:
import feign.Retryer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import static java.util.concurrent.TimeUnit.SECONDS;
@Configuration
public class FeignConfig {
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(100, SECONDS.toMillis(1), 5);
}
}
Bu yapılandırma ile Feign Client, başarısız bir isteği belirli bir süre boyunca yeniden deneyecektir.
5.2 Circuit Breaker ile Dayanıklılık Sağlama
Feign Client’i Resilience4j ile entegre ederek devre kesici (Circuit Breaker) ekleyebilirsiniz. Böylece başarısız olan servislere sürekli çağrı yapılarak sistemi zorlamasını engelleyebilirsiniz.
application.yml dosyasına şu ayarları ekleyin:
feign:
circuitbreaker:
enabled: true
@FeignClient anotasyonuna @CircuitBreaker ekleyerek devre kesici özelliğini aktif edebilirsiniz.
————————
6. Örnek Bir Feign Client Konfigürasyonu
Feign Client için bir yapılandırma sınıfı oluşturarak tüm özellikleri özelleştirebilirsiniz:
import feign.Retryer;
import feign.codec.ErrorDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CustomFeignConfig {
@Bean
public ErrorDecoder errorDecoder() {
return new CustomErrorDecoder();
}
@Bean
public Retryer retryer() {
return new Retryer.Default(100, SECONDS.toMillis(1), 5);
}
// Diğer özel yapılandırmalar
}
Ve bu yapılandırmayı Feign Client arayüzünüzde belirtebilirsiniz:
@FeignClient(name = "user-service", configuration = CustomFeignConfig.class)
public interface UserClient {
@GetMapping("/users/{id}")
User getUserById(@PathVariable("id") Long id);
}
————————
Sonuç
Spring Cloud OpenFeign, mikroservislerin REST API çağrılarını basit ve temiz bir şekilde gerçekleştirmesini sağlar. Feign Client’in sunduğu Retryer, Circuit Breaker, ErrorDecoder gibi özellikler ile yüksek performanslı ve dayanıklı bir yapı oluşturabilirsiniz. API çağrılarını Java arayüzleri üzerinden yaparak kodu daha anlaşılır ve sürdürülebilir hale getirir. Feign, servis keşfi araçları ile entegre çalışarak, mikroservisler arasındaki bağımlılıkları da kolayca yönetmenize olanak tanır.
4.1 Config Server ile Merkezi Yapılandırma
Mikroservis mimarisinde, her bir servisin bağımsız olarak yapılandırma bilgilerine sahip olması ve bu bilgilerin güncellenmesi gerektiğinde tek tek düzenlenmesi karmaşık bir yönetim süreci oluşturur. Spring Cloud Config Server, mikroservisler için merkezi bir yapılandırma yönetimi sağlar. Bu yapı, tüm mikroservislerin yapılandırma dosyalarını tek bir noktada toplar ve merkezi bir konfigürasyon yönetimi sunar. Böylece yapılandırma değişiklikleri merkezi bir yerden yapılabilir ve mikroservislerin güncellenmesi sağlanabilir.
Spring Cloud Config Server Nedir?
Spring Cloud Config Server, mikroservislerin yapılandırmalarını merkezi olarak yönetmek için kullanılan bir sunucudur. Config Server, yapılandırma dosyalarını genellikle bir Git deposundan veya bir dosya sisteminden alır ve bu dosyaları mikroservislere sağlar. Bu merkezi yapılandırma, her bir mikroservisin kendi yapılandırmalarını ayrı ayrı yönetmek zorunda kalmadan, güncellenmiş ayarlara anında erişebilmesini sağlar.
Spring Cloud Config Server’ın Temel Özellikleri
- Merkezi Yapılandırma Yönetimi:
- Tüm mikroservislerin yapılandırma dosyaları merkezi bir Config Server’da saklanır. Bu dosyalar Config Server aracılığıyla mikroservislere sunulur.
- Yapılandırma Güncellemelerinin Anında Yansıması:
- Config Server, yapılandırma dosyalarındaki değişikliklerin anında mikroservislere yansımasını sağlar. Böylece her servisin yapılandırma güncellemeleri için yeniden başlatılması gerekmez.
- Çoklu Ortam Desteği:
- Config Server, farklı ortamlara (development, test, production) göre yapılandırmaları yönetebilir. Bu özellik, her ortama özel yapılandırma dosyalarının saklanmasına ve kolayca erişilmesine imkan tanır.
- Güvenlik ve Erişim Kontrolü:
- Config Server, yapılandırma dosyalarının güvenliğini sağlamak için kimlik doğrulama ve yetkilendirme destekler. Ayrıca, hassas bilgilerin (örneğin, şifreler, API anahtarları) güvenli bir şekilde saklanabilmesi için Vault gibi güvenlik araçlarıyla entegre edilebilir.
Spring Cloud Config Server Kurulumu ve Yapılandırması
- Config Server Projesi Oluşturma:
- Spring Initializr kullanılarak spring-cloud-config-server bağımlılığı ile bir Spring Boot projesi oluşturulur.
- Projede Config Server olarak çalışmasını sağlamak için @EnableConfigServer anotasyonu eklenir.
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
- Yapılandırma Dosyalarını Tanımlama:
- Config Server, yapılandırma dosyalarını genellikle bir Git deposunda saklar. Bu dosyalar application.yml gibi standart dosya formatlarında olabilir. application.yml dosyasında Git deposunun adresi belirtilir.
spring:
cloud:
config:
server:
git:
uri: https://github.com/yourusername/your-config-repo
- Config Client ile Yapılandırma Erişimi:
- Her mikroservis, Config Server’dan yapılandırma bilgilerini almak için spring-cloud-starter-config bağımlılığını ekler.
- application.yml dosyasında Config Server’ın adresi belirtilir:
spring:
cloud:
config:
uri: http://localhost:8888
- Mikroservis başlatıldığında, Config Server’dan yapılandırma bilgilerini alır ve uygulama bu bilgilere göre çalışır.
Yapılandırma Dosyalarının Yapısı
Spring Cloud Config Server’da kullanılan yapılandırma dosyaları, farklı ortamlara göre organize edilebilir. Config Server, dosya adlarını kullanarak ortam bazlı yapılandırmaları ayırır. Örneğin:
- application.yml: Tüm ortamlar için genel ayarlar.
- application-dev.yml: Geliştirme ortamına özel ayarlar.
- application-prod.yml: Üretim ortamına özel ayarlar.
Bu dosyalar, mikroservis tarafından kullanılan spring.profiles.active değeri ile seçilir. Örneğin, geliştirme ortamında spring.profiles.active=dev olarak ayarlanırsa, application-dev.yml dosyasındaki ayarlar geçerli olur.
Config Server ve Config Client Etkileşimi
Config Server ve Config Client arasındaki etkileşim şu şekilde gerçekleşir:
- Config Client İstek Gönderir:
- Her bir mikroservis, Config Server’dan yapılandırma bilgilerini almak için uygulama başlatıldığında bir istek gönderir.
- Config Server Cevap Verir:
- Config Server, Git deposundaki ilgili yapılandırma dosyasını bulur ve Config Client’a döner. Eğer ortam belirtilmişse, ortam dosyasını (örneğin, application-prod.yml) döner.
- Config Client Yapılandırmayı Yükler:
- Mikroservis, aldığı yapılandırmayı yükler ve bu yapılandırma ayarlarına göre çalışır.
- Yapılandırma Güncellemeleri:
- Config Server’daki yapılandırmalar güncellenirse, değişikliklerin mikroservislere anında yansıması için Spring Cloud Bus veya Actuator Refresh kullanılarak yapılandırma yenilenir.
Spring Cloud Config Server’ın Avantajları
- Merkezi Yönetim Kolaylığı:
- Yapılandırmaların tek bir merkezi yerden yönetilmesi, büyük mikroservis sistemlerinde önemli bir kolaylık sağlar. Tek bir yerden yapılan değişiklikler tüm mikroservislere yansıtılır.
- Versiyon Kontrolü:
- Config Server, Git gibi bir versiyon kontrol sistemi ile entegre edilerek yapılandırma değişikliklerinin geçmişini tutabilir. Bu, yapılandırmalarda yapılan değişikliklerin geri alınmasını sağlar.
- Farklı Ortamlara Özel Yapılandırma:
- Config Server, farklı ortamlar için ayrı yapılandırmalar sunarak geliştirme, test ve üretim ortamlarının yönetimini kolaylaştırır.
- Yapılandırma Güncellemelerinin Anında Yansıması:
- Config Server, Spring Cloud Bus veya Actuator Refresh gibi araçlarla yapılandırma güncellemelerinin mikroservislere anında yansımasını sağlar. Böylece sistem yeniden başlatılmadan yeni ayarlar devreye alınabilir.
Spring Cloud Config Server ile Spring Cloud Bus Entegrasyonu
Spring Cloud Bus, Config Server üzerinde yapılan değişikliklerin anında mikroservislere yansımasını sağlar. Spring Cloud Bus, genellikle Kafka veya RabbitMQ gibi mesajlaşma sistemleri ile çalışır ve yapılandırma değişikliklerini mikroservislerin hepsine yayınlar.
Config Server ve Spring Cloud Bus kullanımıyla yapılandırma güncellemeleri şu şekilde yapılır:
- Config Server’da yapılandırma değişikliği yapılır.
- POST /actuator/bus-refresh isteği gönderilerek değişikliklerin mikroservislere anında yansıması sağlanır.
- Spring Cloud Bus, yapılandırma güncellemesini mikroservislerin tamamına gönderir.
Spring Cloud Config Server ve Güvenlik
Config Server, hassas bilgiler içerdiğinden güvenli bir şekilde yapılandırılmalıdır. Spring Cloud Config Server’da güvenlik önlemleri şunlardır:
- HTTPS Kullanımı: Config Server’a erişim HTTPS üzerinden sağlanarak veri güvenliği artırılır.
- Kimlik Doğrulama: Config Server, yalnızca yetkili mikroservislerin erişebileceği şekilde kimlik doğrulama ile korunabilir.
- Secret Management: Spring Vault veya HashiCorp Vault gibi araçlarla gizli bilgilerin güvenli bir şekilde saklanması sağlanabilir.
Spring Cloud Config Server’ın Mikroservis Mimarisindeki Rolü
Spring Cloud Config Server, mikroservis mimarisinde merkezi bir yapılandırma yönetimi sunarak sistem yönetimini büyük ölçüde kolaylaştırır. Özellikle büyük ve karmaşık sistemlerde yapılandırmaların merkezi bir yerden kontrol edilmesi, hem güvenliği artırır hem de operasyonel hataları azaltır.
Config Server’ın mikroservis mimarisindeki başlıca katkıları şunlardır:
- Kolay Yönetim ve İzlenebilirlik: Tüm yapılandırmalar merkezi bir yerde tutulur ve yönetimi kolaylaştırır.
- Sürüm Kontrolü: Yapılandırmaların versiyonları saklanır ve eski sürümlere dönme imkanı sağlar.
- Esneklik ve Hızlı Güncelleme: Yapılandırma değişikliklerinin hızlıca mikroservislere yansımasını sağlar.
Sonuç
Spring Cloud Config Server, merkezi yapılandırma yönetimi ile mikroservislerin esnekliğini artırır ve yönetimini kolaylaştırır. Tek bir noktadan yapılandırma değişiklikleri yapılabilir ve bu değişiklikler tüm
mikroservislere yansıtılabilir. Config Server, özellikle büyük mikroservis mimarilerinde operasyonel verimliliği artırır ve sistemin daha sürdürülebilir hale gelmesini sağlar.
4.2 Spring Cloud Config ile Konfigürasyon Yönetimi
Spring Cloud Config, mikroservis mimarisinde konfigürasyon yönetimini merkezi bir noktadan yapmaya olanak tanır. Mikroservisler genellikle bağımsız olarak çalıştığı ve farklı ortamlarda (development, test, production) yapılandırılabildiği için, her bir servisin konfigürasyonlarını merkezi olarak yönetmek zorlu bir süreçtir. Spring Cloud Config, bu süreci kolaylaştırır ve mikroservislerin yapılandırma dosyalarını bir merkezi sunucu (Config Server) üzerinden yönetilmesini sağlar.
Spring Cloud Config Nedir?
Spring Cloud Config, tüm mikroservislerin yapılandırma ayarlarını tek bir merkezden yönetmek için kullanılır. Config Server, yapılandırma bilgilerini bir Git deposu veya dosya sistemi gibi bir merkezi depoda saklar ve bu bilgileri her mikroservis için erişilebilir hale getirir. Böylece, mikroservisler kendi yapılandırma dosyalarını ayrı ayrı saklamak yerine, Config Server üzerinden gerekli ayarları çekebilir.
Spring Cloud Config iki temel bileşenden oluşur:
- Config Server: Yapılandırma dosyalarını barındırır ve istemcilerin bu dosyalara erişmesini sağlar.
- Config Client: Mikroservislerde kullanılan bir kütüphanedir ve Config Server’dan yapılandırmaları alarak uygulamaya entegre eder.
Spring Cloud Config ile Konfigürasyon Yönetiminin Avantajları
- Merkezi Yönetim:
- Tüm yapılandırmalar merkezi bir Config Server’da tutulur. Bu, tüm mikroservislerin yapılandırma bilgilerini tek bir yerden yönetmeyi mümkün kılar ve sistem yönetimini kolaylaştırır.
- Versiyon Kontrolü:
- Spring Cloud Config, Git gibi bir sürüm kontrol sistemiyle entegre olabilir. Yapılandırma değişiklikleri sürüm kontrollü bir ortamda tutulabilir ve gerektiğinde eski sürümlere geri dönülebilir.
- Ortam Bazlı Yapılandırma:
- Spring Cloud Config, farklı ortamlar için ayrı yapılandırma dosyaları sağlayabilir. Örneğin, geliştirme ve üretim ortamları için farklı yapılandırma ayarları belirlenebilir. Config Server, istemcinin hangi ortama ait olduğunu belirleyerek doğru yapılandırma dosyasını sağlar.
- Dinamik Yapılandırma Güncellemeleri:
- Yapılandırma dosyalarında yapılan değişikliklerin mikroservislere anında yansıması sağlanabilir. Spring Cloud Bus veya Actuator Refresh gibi araçlarla, yapılandırma değişikliklerinin anında mikroservislere iletilmesi mümkündür.
- Güvenlik:
- Config Server, yapılandırma dosyalarını güvenli bir şekilde saklamak için Vault gibi güvenlik araçlarıyla entegre olabilir. Bu, özellikle şifreler ve API anahtarları gibi hassas bilgilerin güvenliğini sağlar.
Spring Cloud Config Yapılandırması
Spring Cloud Config kullanımı için iki ana bileşen yapılandırılır: Config Server ve Config Client.
1. Config Server Yapılandırması
Config Server, merkezi yapılandırmaları saklayan ve istemcilerin bu yapılandırmalara erişimini sağlayan sunucudur.
- Config Server Bağımlılığını Ekleyin:
- Config Server, Spring Boot projesi olarak oluşturulur ve spring-cloud-config-server bağımlılığı eklenir.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
- Config Server Uygulaması Tanımlayın:
- Config Server uygulaması, @EnableConfigServer anotasyonu ile işaretlenir. Bu, uygulamanın bir Config Server olarak çalışmasını sağlar.
@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
- Config Server Yapılandırması:
- application.yml dosyasında, yapılandırma dosyalarının saklanacağı Git deposunun URI’si tanımlanır.
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/yourusername/your-config-repo
Bu örnekte, Config Server yapılandırmalarını bir Git deposundan alacak şekilde yapılandırılmıştır. Alternatif olarak, dosya sistemi veya başka bir veri kaynağı da kullanılabilir.
2. Config Client Yapılandırması
Config Client, her mikroservisin Config Server’dan yapılandırma bilgilerini almasını sağlar.
- Config Client Bağımlılığını Ekleyin:
- Config Client, her mikroservise spring-cloud-starter-config bağımlılığı eklenerek kullanılır.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
- Config Client Yapılandırması:
- Mikroservislerde application.yml dosyasında, Config Server adresi belirtilir.
spring:
cloud:
config:
uri: http://localhost:8888
- Mikroservis, başlatıldığında Config Server’a bağlanarak gerekli yapılandırma bilgilerini çeker.
Spring Cloud Config ile Ortam Bazlı Yapılandırma
Spring Cloud Config, her ortam için ayrı yapılandırma dosyaları sunabilir. Örneğin, geliştirme ve üretim ortamları için farklı yapılandırmalar yapılabilir:
- application.yml: Tüm mikroservislerde ortak kullanılan yapılandırma ayarları.
- application-dev.yml: Geliştirme ortamına özel yapılandırma ayarları.
- application-prod.yml: Üretim ortamına özel yapılandırma ayarları.
Mikroservis başlatılırken, spring.profiles.active ayarı kullanılarak uygun ortam seçilir. Örneğin:
spring:
profiles:
active: dev
Bu durumda, Config Server application-dev.yml dosyasını yükler ve geliştirme ortamına uygun yapılandırmaları sağlar.
Spring Cloud Config ile Dinamik Yapılandırma Güncellemeleri
Spring Cloud Config, Spring Cloud Bus ve Actuator ile entegre edilerek yapılandırma değişikliklerinin anında mikroservislere yansımasını sağlar.
- Spring Cloud Bus: Spring Cloud Bus, Kafka veya RabbitMQ gibi mesajlaşma sistemlerini kullanarak yapılandırma değişikliklerini mikroservislere anında iletir.
- Actuator Refresh: Actuator’ın refresh uç noktası kullanılarak, yapılandırma değişikliklerinin manuel olarak yenilenmesi sağlanabilir.
Config Server’da bir yapılandırma değişikliği yapıldıktan sonra, Spring Cloud Bus şu şekilde çalışır:
- POST /actuator/bus-refresh isteği gönderilir.
- Spring Cloud Bus, yapılandırma değişikliğini tüm mikroservislere iletir.
- Mikroservisler yapılandırmalarını güncelleyerek yeni ayarları devreye alır.
Spring Cloud Config ile Güvenlik
Config Server üzerinde hassas yapılandırma bilgileri saklanabileceği için güvenlik önlemleri almak önemlidir.
- HTTPS Kullanımı: Config Server’a erişim HTTPS üzerinden sağlanmalıdır.
- Kimlik Doğrulama: Config Server’a erişen istemcilerin kimlik doğrulaması yapması sağlanabilir.
- Vault Entegrasyonu: Spring Cloud Config, HashiCorp Vault gibi gizli bilgilerin güvenli bir şekilde saklanmasını sağlayan güvenlik araçları ile entegre olabilir.
Spring Cloud Config’in Mikroservis Mimarisi için Önemi
Spring Cloud Config, mikroservislerin yapılandırmalarını merkezi bir noktadan yöneterek esnek, sürdürülebilir ve güvenilir bir yapı sağlar. Özellikle büyük ve karmaşık mikroservis mimarilerinde, yapılandırma yönetimi zorluk yaratabilir. Spring Cloud Config, tüm yapılandırmaları tek bir yerden yönetmeyi mümkün kılarak bu süreci basitleştirir.
Spring Cloud Config’in mikroservis mimarisinde sağladığı başlıca avantajlar şunlardır:
- Kolay Yönetim: Tüm mikroservisler için tek bir yapılandırma noktası.
- Esneklik: Farklı ortamlar için özel yapılandırmalar.
- Hızlı Güncellemeler: Yapılandırma değişikliklerinin anında mikroservislere yansıması.
- Güvenlik: Merkezi yapılandırma ile güvenlik önlemlerinin alınması.
Sonuç
Spring Cloud Config, mikroservislerin merkezi yapılandırma yönetimini kolaylaştırarak büyük ve karmaşık sistemlerde operasyonel verimliliği artırır. Yapılandırma ayarlarının merkezi olarak yönetilmesi, güncellenmesi ve güvenli bir şekilde saklanması sayesinde mikroservislerin performansı ve yönetilebilirliği artar. Bu özellikler, Spring Cloud Config’i mikroservis mimarisinde konfigürasyon yönetimi için ideal
bir araç haline getirir.
4.3 Güvenli Konfigürasyon Yönetimi (Vault ile Entegrasyon)
Mikroservislerde güvenli bir şekilde konfigürasyon yönetimi, özellikle hassas bilgilerin (örneğin, veritabanı şifreleri, API anahtarları, kimlik doğrulama bilgileri) saklanması açısından kritik öneme sahiptir. Spring Cloud Config, bu tür yapılandırma bilgilerini merkezi bir noktadan yönetmeyi sağlar; ancak, hassas bilgilerin güvenli bir şekilde saklanması ve yönetilmesi için HashiCorp Vault gibi gizli bilgi yönetim araçlarıyla entegre edilebilir. Vault, bu bilgilerin güvenli bir şekilde saklanmasını, şifrelenmesini ve erişim denetimini sağlar.
Vault Nedir?
HashiCorp Vault, hassas bilgilerin güvenli bir şekilde saklanmasını, erişim denetimlerinin yapılmasını ve veri güvenliğinin sağlanmasını sağlayan bir gizli bilgi yönetim platformudur. Vault, gizli bilgileri güvenli bir ortamda saklar, ihtiyaç duyulduğunda bu bilgilere güvenli bir şekilde erişim sağlar ve dinamik erişim kontrolleri sunar. Vault, yapılandırma bilgilerini saklarken şifreleme kullanır ve erişim kontrolleri ile yetkisiz erişimlerin önüne geçer.
Vault’un Temel Özellikleri
- Gizli Bilgi Deposu:
- Vault, şifreleme ile korunan bir gizli bilgi deposu sağlar. Bu depo, veritabanı şifreleri, API anahtarları, sertifikalar gibi hassas bilgileri güvenli bir şekilde saklar.
- Erişim Kontrolü:
- Vault, kullanıcılar ve uygulamalar için detaylı erişim kontrolleri sunar. Her uygulama veya kullanıcı için farklı izinler belirlenebilir.
- Dinamik Erişim:
- Vault, dinamik erişim kontrolleri sunarak geçici (temporary) kimlik bilgileri oluşturabilir. Bu, uzun süreli erişim bilgilerini önler ve güvenliği artırır.
- Şifreleme ve Deşifre Etme Hizmeti:
- Vault, verilerin şifrelenmesi ve deşifre edilmesi işlemlerini merkezi bir şekilde yönetir. Şifrelenmiş veriler yalnızca yetkili uygulamalar tarafından okunabilir.
Spring Cloud Config ile Vault Entegrasyonu
Spring Cloud Config, Vault ile entegre edilerek mikroservislerde güvenli bir şekilde konfigürasyon yönetimi yapılmasını sağlar. Bu entegrasyon sayesinde, Config Server hassas bilgileri doğrudan Vault’tan çekebilir ve mikroservislere güvenli bir şekilde iletebilir.
Adım Adım Vault Entegrasyonu
- Vault Sunucusunu Kurun:
- HashiCorp Vault sunucusu kurulup çalıştırılmalıdır. Bu işlem için Vault'un resmi dökümantasyonundan faydalanarak, Vault’u yerel olarak veya bulut ortamında çalıştırabilirsiniz.
- Vault, başlatıldıktan sonra yapılandırmalarını yönetmek için bir “secrets engine” ayarlamanız gerekir.
- Vault Bağımlılığını Ekleyin:
- Spring Cloud Config Server projesinde spring-cloud-starter-vault-config bağımlılığını ekleyin.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-vault-config</artifactId>
</dependency>
- Vault Yapılandırmalarını Tanımlayın:
- Config Server’ın application.yml dosyasında Vault bağlantı bilgilerini tanımlayın. Örneğin:
spring:
cloud:
vault:
host: localhost
port: 8200
scheme: http
authentication: token
token: s.yourVaultTokenHere
kv:
enabled: true
backend: secret
Bu yapılandırmada:
- host ve port, Vault sunucusunun adresini belirtir.
- authentication, Vault ile kimlik doğrulama yöntemini belirler (bu örnekte token kullanılıyor).
- token, Vault tarafından sağlanan erişim token’ıdır.
- kv.backend, gizli bilgilerin saklanacağı KV (Key-Value) depolama yolunu belirtir.
- Vault’ta Gizli Bilgi Ekleyin:
- Vault’ta bir gizli bilgi oluşturun. Örneğin, secret/application yolunda database.password gibi bir anahtar-değer çifti ekleyebilirsiniz.
vault kv put secret/application database.password=mySecurePassword
Bu komut, Vault’un secret/application yolunda bir database.password anahtarını ve onun değerini saklar.
- Config Server’da Gizli Bilgiyi Kullanma:
- Artık Config Server, Vault’tan yapılandırma bilgilerini çekebilir. Config Client olarak çalışan mikroservis, Config Server üzerinden database.password gibi hassas bilgilere erişebilir.
Mikroservislerde bu bilgiye erişmek için, yapılandırma dosyasında şu şekilde kullanabilirsiniz:
datasource:
password: ${database.password}
Güvenli Konfigürasyon Yönetimi için Vault Kullanımı
Vault, hassas bilgilerin saklanması ve yönetimi konusunda bazı gelişmiş güvenlik özellikleri sunar:
- Dinamik Kimlik Bilgileri (Dynamic Secrets):
- Vault, veritabanları veya bulut sağlayıcıları gibi hizmetler için geçici kimlik bilgileri oluşturabilir. Bu kimlik bilgileri belirli bir süre sonra geçerliliğini kaybeder ve bu sayede güvenlik artar.
- Gizli Bilgi Yenileme (Renewal):
- Vault, hassas bilgileri düzenli olarak yenileyebilir ve bu bilgilerin eski kimlik bilgileriyle değiştirilmesini sağlar. Yenileme süresi sona erdiğinde, Vault yeni kimlik bilgileri oluşturur.
- Erişim Politikaları:
- Vault, kullanıcılar ve uygulamalar için detaylı erişim politikaları tanımlamaya olanak tanır. Bu sayede, hangi mikroservisin hangi gizli bilgilere erişebileceği denetlenebilir.
- Audit Logs (Denetim Günlükleri):
- Vault, tüm erişim işlemlerini ve yapılan değişiklikleri kaydeder. Bu denetim günlükleri, erişim güvenliği açısından önemli bir bilgi sağlar.
Spring Cloud Config ile Vault Entegrasyonunun Avantajları
- Güvenli Saklama:
- Vault, hassas bilgilerin güvenli bir şekilde saklanmasını sağlar ve yalnızca yetkili uygulamaların bu bilgilere erişmesine izin verir.
- Dinamik Kimlik Bilgileri:
- Vault’un dinamik kimlik bilgileri özelliği, uzun süreli kimlik bilgileri yerine geçici kimlik bilgileri kullanarak güvenlik açıklarını azaltır.
- Merkezi Yönetim:
- Spring Cloud Config ile Vault entegrasyonu, tüm mikroservislerin hassas bilgilerini merkezi olarak yönetmeyi mümkün kılar.
- Kolay Erişim Denetimi:
- Vault ile tanımlanan erişim politikaları sayesinde, hangi mikroservisin hangi bilgilere erişebileceği kolayca denetlenebilir.
- Audit ve İzlenebilirlik:
- Vault’un denetim günlükleri sayesinde, tüm erişim işlemleri izlenebilir ve güvenlik olayları kolayca tespit edilebilir.
Sonuç
Spring Cloud Config ile Vault entegrasyonu, mikroservislerde güvenli konfigürasyon yönetimini sağlar. Vault’un sunduğu şifreleme, erişim denetimi, dinamik kimlik bilgileri ve audit gibi özellikler, hassas bilgilerin güvenli bir şekilde yönetilmesine olanak tanır. Merkezi bir yapılandırma yönetimi sunan Spring Cloud Config, Vault ile birlikte kullanıldığında mikroservislerde konfigürasyon güvenliğini artırır ve yönetimi kolaylaştırır. Bu entegrasyon, özellikle büyük ölçekli ve hassas bilgilerin olduğu mikroservis mimarilerinde güvenliğin sağlanması açısından kritik bir rol oynar.
5.1 Spring Cloud Circuit Breaker ve Hystrix ile Devre Kesici Deseni
Mikroservis mimarisinde, bir servisin başarısız olması diğer servisleri de etkileyebilir ve zincirleme hatalara yol açabilir. Devre Kesici (Circuit Breaker) deseni, bir servisin başarısızlığını algılayarak bu hatanın diğer servisleri etkilemesini önler. Bu desen, servisler arasındaki bağımlılıkları izler ve başarısız bir servisle iletişimi geçici olarak durdurarak sistemi korur. Spring Cloud Circuit Breaker ve Netflix Hystrix, devre kesici deseni uygulamak için kullanılan popüler araçlardır.
Devre Kesici Deseni Nedir?
Devre kesici deseni, bir servisin başarısızlığını algılayarak diğer servislerin bu hatadan etkilenmesini önleyen bir dayanıklılık modelidir. Bu desen, özellikle mikroservis mimarisinde zincirleme hataların önüne geçmek için geliştirilmiştir. Devre kesici deseni, bir servisle iletişimde sorun olduğunda iletişimi geçici olarak keser ve bu iletişimi sadece servis sağlıklı çalışmaya başladığında tekrar kurar.
Devre kesici deseni üç ana durumda çalışır:
- Kapalı (Closed): Devre kesici kapalı durumda, yani normal durumda iken istekler doğrudan hedef servise iletilir.
- Açık (Open): Hedef serviste sürekli başarısızlıklar yaşanırsa devre kesici açılır ve tüm istekler hemen başarısız olur. Bu durum, sistemi yavaşlamaktan korur.
- Yarı Açık (Half-Open): Belirli bir süre geçtikten sonra devre kesici yarı açık duruma gelir ve test için birkaç isteği tekrar hedef servise gönderir. Eğer istekler başarılı olursa devre kapatılır; başarısız olursa tekrar açık duruma döner.
Spring Cloud Circuit Breaker ve Hystrix
Spring Cloud Circuit Breaker, devre kesici desenini uygulamak için bir Spring Cloud projesidir ve dayanıklılık sağlamak için çeşitli devre kesici kütüphaneleri (Resilience4j, Hystrix vb.) destekler. Hystrix, Netflix tarafından geliştirilen bir devre kesici kütüphanesidir ve başarısız olan servisleri geçici olarak devre dışı bırakarak sistemi korur.
Spring Cloud Circuit Breaker’ın Hystrix ile kullanımı oldukça yaygındır, ancak Hystrix Netflix tarafından güncellenmediği için Spring Cloud Circuit Breaker’ın Resilience4j gibi güncel araçlarla da çalışması mümkündür.
Hystrix ile Devre Kesici Deseni Kurulumu
Hystrix ile devre kesici deseni kurmak için aşağıdaki adımları izleyebilirsiniz:
- Hystrix Bağımlılığını Ekleyin:
- Spring Boot projenize spring-cloud-starter-netflix-hystrix bağımlılığını ekleyin.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- Hystrix Devre Kesici Anotasyonunu Ekleyin:
- Devre kesici deseni kullanmak için, ana sınıfta @EnableCircuitBreaker anotasyonunu ekleyin.
@SpringBootApplication
@EnableCircuitBreaker
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- Devre Kesici ile Yönetilecek Metotlara Anotasyon Ekleyin:
- Devre kesici deseninin uygulandığı metotlara @HystrixCommand anotasyonunu ekleyin ve bir geri dönüş (fallback) metodu tanımlayın. Bu geri dönüş metodu, hedef servis başarısız olduğunda çalışacak olan alternatif bir işlemi tanımlar.
@Service
public class MyService {
@HystrixCommand(fallbackMethod = "fallbackMethod")
public String callExternalService() {
// Dış servise çağrı yapılır
return restTemplate.getForObject("http://external-service/api/data", String.class);
}
public String fallbackMethod() {
// Servis başarısız olursa bu yöntem çalışır
return "Hizmet şu anda kullanılamıyor, lütfen daha sonra tekrar deneyin.";
}
}
Bu örnekte, callExternalService metodu dış bir servise istek gönderir. Eğer bu servis başarısız olursa, fallbackMethod devreye girer ve kullanıcıya alternatif bir mesaj döner.
Hystrix ile Devre Kesici Yapılandırma Parametreleri
Hystrix, devre kesicinin çalışma şeklini özelleştirmek için bazı yapılandırma parametreleri sağlar. Bu parametreler application.yml dosyasında tanımlanabilir:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000 # İsteklerin zaman aşımı süresi
circuitBreaker:
requestVolumeThreshold: 10 # Devrenin açılması için gereken minimum istek sayısı
sleepWindowInMilliseconds: 10000 # Yarı açık duruma geçiş için bekleme süresi
errorThresholdPercentage: 50 # Hata oranı %50'yi geçtiğinde devre açılır
- timeoutInMilliseconds: İsteklerin zaman aşımı süresini belirler. Bu süre aşıldığında devre kesici çalışır.
- requestVolumeThreshold: Devre kesicinin açılması için gereken minimum istek sayısını belirler.
- sleepWindowInMilliseconds: Devre kesici açık duruma geçtiğinde, tekrar deneme yapılmadan önce beklenen süre.
- errorThresholdPercentage: Hata oranı belirli bir yüzdeyi aştığında devre kesici açılır.
Hystrix Dashboard ile İzleme
Hystrix, devre kesici durumu ve performans metriklerini izlemek için Hystrix Dashboard adı verilen bir izleme aracı sunar. Hystrix Dashboard, devre kesicinin sağlığını izleyerek, sistemdeki olası problemleri önceden tespit etmenizi sağlar.
- Hystrix Dashboard Bağımlılığını Ekleyin:
- Projenize spring-cloud-starter-netflix-hystrix-dashboard bağımlılığını ekleyin.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
- Hystrix Dashboard’u Etkinleştirin:
- Ana sınıfa @EnableHystrixDashboard anotasyonunu ekleyin.
@SpringBootApplication
@EnableHystrixDashboard
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
- Hystrix Stream Endpoint’i Tanımlayın:
- application.yml dosyasında, Hystrix akışının izlenebilmesi için hystrix.stream endpoint’i etkinleştirilir:
management:
endpoints:
web:
exposure:
include: hystrix.stream
- Hystrix Dashboard’u Kullanma:
- Uygulama başlatıldıktan sonra http://localhost:8080/hystrix adresine giderek Hystrix Dashboard’u açabilirsiniz.
- Bu adrese, izlemek istediğiniz servisin hystrix.stream endpoint’ini (örneğin, http://localhost:8080/actuator/hystrix.stream) girerek devre kesici durumunu ve performans metriklerini izleyebilirsiniz.
Devre Kesici Deseninin Avantajları
- Hata İzolasyonu:
- Devre kesici deseni, başarısız olan bir servisin sistemin tamamını etkilemesini önler. Başarısız servisle iletişim geçici olarak kesilir ve hata izole edilir.
- Dayanıklılık ve Esneklik:
- Sistem, hatalı veya yavaş çalışan bir servise bağlı olarak performans kaybına uğramaz. Devre kesici, sistemin daha dayanıklı ve esnek olmasını sağlar.
- Geri Dönüş Mekanizması:
- Başarısız olan servise yapılan istekler için bir alternatif (fallback) sağlanabilir. Bu, kullanıcı deneyimini artırır ve sistemin hizmet vermeye devam etmesini sağlar.
- Performans İzleme:
- Hystrix Dashboard gibi izleme araçları ile devre kesicinin durumu ve sistem performansı takip edilebilir, bu da potansiyel problemleri önceden tespit etmeyi sağlar.
Spring Cloud Circuit Breaker Alternatifleri
Netflix Hystrix, devre kesici deseni için popüler bir araçtır; ancak artık aktif olarak geliştirilmemektedir. Bunun yerine Spring Cloud Circuit Breaker, Resilience4j gibi daha modern ve aktif olarak geliştirilen kütüphaneleri destekler. Resilience4j, dev
re kesici, yeniden deneme, hız sınırlama ve hata yönetimi gibi ek özellikler sunar ve Hystrix’in yerini alabilecek bir alternatiftir.
Sonuç
Spring Cloud Circuit Breaker ve Hystrix ile devre kesici deseni, mikroservislerin dayanıklılığını ve güvenilirliğini artırır. Bu desen sayesinde, başarısız olan servislerin sistem üzerinde oluşturduğu yük minimuma indirilir ve kullanıcılar için kesintisiz bir deneyim sunulur. Hystrix ile devre kesici uygulamak, sistemdeki hataların izole edilmesini ve zincirleme hataların önlenmesini sağlar. Gelişmiş izleme özellikleri ile de sistemin performansı ve sağlığı kolayca takip edilebilir.
Evet, Netflix Hystrix artık aktif olarak geliştirilmediği için, Spring Cloud Circuit Breaker kütüphanesi Hystrix’in yerine Resilience4j gibi daha modern ve aktif olarak geliştirilen kütüphaneleri destekler. Resilience4j, devre kesici desenini uygulamak için tercih edilen, güncel bir kütüphanedir ve mikroservislerin dayanıklılığını artırmak için çeşitli ek özellikler sunar.
Resilience4j, yalnızca devre kesici deseniyle sınırlı kalmaz; aynı zamanda aşağıdaki gibi ek özellikleri de destekler:
- Retry (Yeniden Deneme):
- Bir servis başarısız olduğunda belirli sayıda yeniden deneme yapar. Eğer başarılı olursa istek tamamlanır, başarısız olursa devre kesici açılır.
- Rate Limiter (Hız Sınırlama):
- Belirli bir zaman aralığında gelen istekleri sınırlar. Böylece, bir servisin aşırı yüklenmesi veya yoğun bir trafik altında performans kaybı yaşaması önlenir.
- Bulkhead (Bölme):
- Sistem kaynaklarının izolasyonunu sağlar. Örneğin, bir mikroservisin belirli bir kaynak kümesiyle sınırlandırılması ve diğer servislerin kaynaklarına erişiminin engellenmesi sağlanabilir.
- Timeout (Zaman Aşımı):
- Uzun süre yanıt vermeyen işlemler için belirli bir zaman aşımı süresi belirler. Zaman aşımı süresi dolduğunda istek iptal edilir.
Resilience4j, Hystrix’e kıyasla daha hafif ve daha modülerdir. Bu nedenle, Spring Cloud Circuit Breaker ile Resilience4j kullanmak, mikroservislerin dayanıklılık mekanizmalarını daha esnek ve güncel bir yapıya kavuşturur. Ayrıca, Spring Cloud Circuit Breaker kütüphanesi, Resilience4j’i Spring ekosistemine kolayca entegre eden bir yapı sunar, bu da dayanıklılık yönetimini daha basit hale getirir.
Spring Cloud Circuit Breaker ile Resilience4j Kullanımı
Spring Cloud Circuit Breaker ile Resilience4j kullanmak için şu adımları takip edebilirsiniz:
- Resilience4j Bağımlılığını Ekleyin:
- <dependency>
- <groupId>io.github.resilience4j</groupId>
- <artifactId>resilience4j-spring-boot2</artifactId>
- <version>1.7.0</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
- </dependency>
- Devre Kesici ile Yöntem Anotasyonu:
- Spring’in @CircuitBreaker anotasyonu ile devre kesici uygulanacak metotları belirleyin ve bir fallback metodu tanımlayın.
@Service
public class MyService {
@CircuitBreaker(name = "myServiceCircuitBreaker", fallbackMethod = "fallbackMethod")
public String callExternalService() {
// Dış servise çağrı yapılır
return restTemplate.getForObject("http://external-service/api/data", String.class);
}
public String fallbackMethod(Throwable throwable) {
// Hata durumunda çalışacak alternatif işlev
return "Hizmet şu anda kullanılamıyor, lütfen daha sonra tekrar deneyin.";
}
}
- Yapılandırma Ayarları:
- Resilience4j ile devre kesici, yeniden deneme ve hız sınırlama gibi ayarları application.yml dosyasında yapılandırabilirsiniz.
resilience4j:
circuitbreaker:
instances:
myServiceCircuitBreaker:
registerHealthIndicator: true
slidingWindowSize: 10
minimumNumberOfCalls: 5
failureRateThreshold: 50
waitDurationInOpenState: 10000ms
retry:
instances:
myServiceCircuitBreaker:
maxAttempts: 3
waitDuration: 200ms
ratelimiter:
instances:
myServiceCircuitBreaker:
limitForPeriod: 10
timeoutDuration: 500ms
Bu yapılandırmada:
- slidingWindowSize: Devre kesici penceresinin büyüklüğünü belirler.
- failureRateThreshold: Hata oranı bu değeri geçerse devre açılır.
- waitDurationInOpenState: Devre açıkken bekleme süresini belirler.
- maxAttempts: Yeniden deneme sayısını belirler.
- limitForPeriod: Belirli bir zaman aralığında izin verilen maksimum istek sayısını belirler.
Resilience4j ile Spring Cloud Circuit Breaker kullanarak, mikroservislerin performansını ve dayanıklılığını artırabilir, sistemin genel güvenilirliğini sağlayabilirsiniz. Bu, mikroservislerin daha esnek bir yapı ile çalışmasına imkan tanır ve daha iyi bir kullanıcı deneyimi sunar.
5.3 OAuth2 ve Spring Security ile Mikroservis Güvenliği
Mikroservis mimarisinde, her bir mikroservisin bağımsız olarak çalışması ve birbiriyle iletişim kurması gerekir. Bu durumda, güvenlik büyük önem taşır çünkü her mikroservis arasında yapılan iletişimin güvenliğini sağlamak gerekir. OAuth2 ve Spring Security, mikroservis mimarisinde güvenlik sağlamak için yaygın olarak kullanılan iki güçlü araçtır. OAuth2, kullanıcı kimlik doğrulaması ve yetkilendirme sürecini yönetirken; Spring Security, uygulama güvenliğini sağlamaya yönelik kapsamlı bir güvenlik çerçevesidir.
OAuth2 Nedir?
OAuth2, bir kullanıcıya veya bir uygulamaya üçüncü taraf bir kaynağa erişim izni vermek için kullanılan bir yetkilendirme protokolüdür. Kullanıcı, kimlik bilgilerini uygulama ile paylaşmak zorunda kalmadan belirli bir süre için üçüncü bir tarafa (örneğin, bir mikroservise) erişim yetkisi verir. OAuth2, genellikle access token (erişim belirteci) ile çalışır ve bu belirteç belirli kaynaklara erişimi sağlar.
OAuth2, dört temel akış sağlar:
- Authorization Code Grant: Kullanıcılar tarayıcı üzerinden oturum açarak uygulamaya erişim yetkisi verir.
- Implicit Grant: Mobil veya JavaScript tabanlı uygulamalar için kullanılır.
- Client Credentials Grant: Sunucular arası iletişimde, kimlik doğrulaması yapılmış istemcilerin erişimi sağlanır.
- Resource Owner Password Credentials Grant: Kullanıcının doğrudan kimlik bilgilerini kullanarak erişim sağladığı akıştır (kullanılması önerilmez).
Mikroservislerde OAuth2 ile Güvenlik
Mikroservislerde OAuth2, kimlik doğrulama ve yetkilendirme sağlamak için kullanılır. OAuth2, bir erişim belirteci (access token) ile çalışır. Bu belirteç, belirli bir mikroservisin diğer mikroservislerin kaynaklarına güvenli bir şekilde erişmesini sağlar.
Mikroservis mimarisinde güvenlik yapılandırması genellikle şu bileşenlerden oluşur:
- Authorization Server: Kullanıcı kimlik doğrulaması yapar ve erişim belirteçlerini oluşturur.
- Resource Server: Korunan kaynakları sağlar ve gelen erişim belirtecinin geçerliliğini doğrular.
- Client: Erişim belirteci alarak Resource Server’dan veri talep eden istemci uygulama veya mikroservis.
Spring Security ile OAuth2 Entegrasyonu
Spring Security ve Spring Security OAuth2 modülleri, OAuth2 güvenlik standartlarını Spring uygulamalarına entegre etmek için kullanılır. Bu modüller ile Authorization Server, Resource Server ve istemci yapılandırmaları yapılabilir.
1. Authorization Server Kurulumu
Authorization Server, kullanıcıların kimlik doğrulamasını yapan ve erişim belirteci oluşturan sunucudur. Spring Security OAuth2 ile Authorization Server kurulumu için aşağıdaki adımlar izlenir.
- Spring Boot Projesi Oluşturma:
- Spring Boot projesine spring-boot-starter-oauth2-resource-server ve spring-security-oauth2-autoconfigure bağımlılıklarını ekleyin.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security.oauth.boot</groupId>
<artifactId>spring-security-oauth2-autoconfigure</artifactId>
<version>2.1.2.RELEASE</version>
</dependency>
- Authorization Server Yapılandırması:
- Authorization Server yapılandırması için aşağıdaki kodu kullanabilirsiniz:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("client-id")
.secret("{noop}client-secret")
.authorizedGrantTypes("authorization_code", "refresh_token", "password", "client_credentials")
.scopes("read", "write")
.accessTokenValiditySeconds(3600);
}
@Override
public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
security.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()");
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore())
.authenticationManager(authenticationManager);
}
@Bean
public TokenStore tokenStore() {
return new InMemoryTokenStore();
}
}
Bu yapılandırmada:
- ClientDetailsServiceConfigurer: Kimlik doğrulaması yapılmış istemcilerin kimlik bilgilerini tanımlar.
- AuthorizationServerSecurityConfigurer: Token ile ilgili güvenlik yapılandırmalarını tanımlar.
- AuthorizationServerEndpointsConfigurer: Erişim belirteçlerinin (tokens) nasıl yönetileceğini ve saklanacağını tanımlar.
2. Resource Server Yapılandırması
Resource Server, korunan kaynakları sağlayan sunucudur ve OAuth2 erişim belirteçlerini doğrular.
- Resource Server Yapılandırması:
- @Configuration
- @EnableResourceServer
- public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
- @Override
- public void configure(HttpSecurity http) throws Exception {
- http
- .authorizeRequests()
- .antMatchers("/public/**").permitAll()
- .antMatchers("/api/**").authenticated();
- }
- }
- Bu yapılandırmada:
- /public/** yollarına gelen istekler için kimlik doğrulaması yapılmazken, /api/** yollarına gelen istekler için kimlik doğrulaması zorunludur.
3. Client (İstemci) Yapılandırması
İstemci uygulama, Authorization Server’dan erişim belirteci alarak Resource Server’a erişim sağlar. İstemci kimlik bilgilerini doğruladıktan sonra OAuth2 yetkilendirme sunucusundan erişim belirteci alır ve bu belirteç ile Resource Server’a istek gönderir.
- Erişim Belirteci Alma:
- İstemci, OAuth2 yetkilendirme sunucusuna bir istek göndererek erişim belirteci alır.
@Service
public class OAuth2ClientService {
public String getAccessToken() {
// Token alma işlemi
return restTemplate.postForObject("http://localhost:8080/oauth/token", request, String.class);
}
}
Burada, erişim belirteci alındıktan sonra diğer mikroservislere yapılacak isteklerde Authorization başlığı ile bu belirteç gönderilir.
JWT (JSON Web Token) Kullanarak OAuth2 Token Saklama
OAuth2’de erişim belirteci olarak JWT kullanmak, token doğrulama işlemini kolaylaştırır. JWT, belirteç içinde kullanıcının kimlik bilgilerini güvenli bir şekilde saklar ve şifrelenmiş bir formattadır. JWT kullanıldığında, erişim belirteçleri merkezi bir veri deposunda tutulmak zorunda değildir, bu da sistemi daha ölçeklenebilir hale getirir.
- JWT Token Store Yapılandırması:
- AuthorizationServerConfig sınıfında JWT kullanarak erişim belirteçlerini saklayabilirsiniz.
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("your-signing-key"); // İmzalama anahtarı
return converter;
}
- JWT ile Resource Server Yapılandırması:
- Resource Server’da, erişim belirteçlerini doğrulamak için JWT kullanımı şu şekilde yapılandırılır:
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.tokenStore(tokenStore());
}
Spring Security ve OAuth2 Kullanmanın Avantajları
- Merkezi Kimlik Doğrulama:
- OAuth2 ile kullanıcı kimlik doğrulaması merkezi bir sunucuda yapılır. Bu, güvenliği artırır ve kullanıcı deneyimini iyileştirir.
- Yetkilendirme Yönetimi:
- OAuth2, her mikroservisin yetkilendirme işlemlerini merkezi bir sunucu üzerinden yönetmesine olanak tanır.
- Token Tabanlı Güvenlik:
- OAuth2 ile token tabanlı güvenlik kullanılarak kimlik doğrulama işlemi yapılır. Token tabanlı sistemler daha hızlı ve güvenli bir erişim sağlar.
- Kolay Entegrasyon ve Taşınabilirlik:
- OAuth2, farklı istemcilerin (web, mobil, vs.) kimlik doğrulaması yapmasını ve korunan kaynaklara erişmesini sağlar. JWT kullanımı ise taşınabilirliği artırır.
6.1 Apache Kafka ile Mesajlaşma
Mikroservis mimarisinde, mikroservislerin bağımsız olarak çalışması ve birbirleriyle asenkron bir şekilde iletişim kurması kritik öneme sahiptir. Apache Kafka, mikroservisler arasında güvenilir, ölçeklenebilir ve yüksek performanslı bir mesajlaşma sistemi sunarak bu iletişimi sağlar. Kafka, yüksek hacimli veri akışlarını işlemek için ideal bir mesajlaşma platformudur ve bir olay odaklı (event-driven) mimarinin temel bileşeni olarak kullanılabilir.
Apache Kafka Nedir?
Apache Kafka, LinkedIn tarafından geliştirilen ve günümüzde geniş bir kullanıcı kitlesi tarafından kullanılan dağıtık bir mesajlaşma ve veri akışı işleme platformudur. Kafka, olayların yüksek performansla iletilmesini sağlar ve hem veri akışını yönetir hem de olayları işlemek için kullanılan bir olay yayınlama-saklama sistemidir.
Kafka, özellikle mikroservis mimarilerinde aşağıdaki iletişim ve veri aktarım ihtiyaçları için kullanılır:
- Asenkron İletişim: Mikroservislerin birbirinden bağımsız olarak veri alışverişinde bulunmasını sağlar.
- Olay Odaklı Mimariler: Mikroservisler arasında gerçekleşen olayların gerçek zamanlı olarak izlenmesini sağlar.
- Yüksek Performans: Düşük gecikme süreleri ile yüksek hacimli verilerin hızlı bir şekilde iletilmesini sağlar.
- Dağıtık ve Ölçeklenebilir Yapı: Kafka, birçok düğüm üzerinde çalışarak yatay olarak ölçeklenebilir.
Apache Kafka’nın Temel Bileşenleri
- Producer (Üretici):
- Verileri Kafka’ya gönderen bileşendir. Producer, Kafka’da belirli bir konuya (topic) mesaj gönderir ve bu mesajlar konularda tutulur.
- Consumer (Tüketici):
- Kafka’dan mesajları okuyan bileşendir. Consumer, bir konuya abone olarak mesajları okur ve işleme alır.
- Topic (Konu):
- Mesajların kategorize edildiği yapıdır. Kafka’da her bir konu, belirli bir veri türünü ifade eder ve producer, mesajları bu konulara gönderir. Tüketiciler ise bu konulardan mesajları okur.
- Broker:
- Mesajların dağıtımını sağlayan sunucuya verilen addır. Kafka, birden fazla broker üzerinde çalışabilir ve bu brokerlar, verileri dağıtarak ölçeklenebilirliği sağlar.
- Partition (Bölüm):
- Her bir konu, birden fazla bölüme (partition) ayrılarak daha yüksek performans ve paralel işleme kapasitesi sağlar. Her bölümdeki veriler, belirli bir sırayla işlenir ve bu sayede verilerin sıralı bir şekilde işlenmesi sağlanır.
- Zookeeper:
- Kafka'nın yönetiminde kullanılan bir koordinasyon aracıdır. Zookeeper, brokerların durumunu izler, yeni brokerları kümeye ekler veya bozuk olan brokerları kaldırır. Ayrıca, tüketicilerin konumunu da yönetir.
Apache Kafka’nın Çalışma Prensibi
- Mesaj Gönderme:
- Producer, belirli bir konuya mesaj gönderir. Kafka, bu mesajı konudaki bir bölüme yazar.
- Mesaj Saklama:
- Mesajlar, konularda ve bölümlerde belirli bir süre boyunca saklanır. Kafka, mesajları saklama süresine göre (örneğin, 7 gün) veya belirli bir veri boyutuna ulaştığında siler.
- Mesaj Tüketme:
- Consumer, belirli bir konuya abone olarak mesajları okur. Kafka’da mesajlar birden fazla tüketici tarafından işlenebilir. Tüketici grupları sayesinde, her mesaj yalnızca bir tüketici tarafından işlenir.
Apache Kafka ve Mikroservis Mimarisi
Mikroservis mimarisinde Kafka, özellikle olay odaklı mimarilerde veri aktarımı ve asenkron iletişim için kullanılır. Kafka’nın mikroservis mimarisinde nasıl kullanıldığına dair bazı örnekler:
- Olay Yayını (Event Broadcasting):
- Mikroservisler arasında gerçekleşen olaylar (örneğin, bir siparişin oluşturulması) Kafka’ya gönderilir. Bu olaylar diğer mikroservisler tarafından dinlenir ve işlenir.
- Olay Temelli Veri Aktarımı:
- Mikroservisler arasında veri akışı sağlanır. Örneğin, bir kullanıcı kaydolduğunda kullanıcı servisi, bu olayı Kafka’ya gönderir ve diğer servisler (e-posta servisi, bildirim servisi gibi) bu olayı işleyebilir.
- İşlem Akışları (Stream Processing):
- Kafka, büyük veri işlemleri için işlem akışlarını destekler. Örneğin, bir veri analitiği sistemi Kafka’dan gelen olayları analiz edebilir ve sonuçları diğer sistemlere iletebilir.
- Yüksek Performans ve Ölçeklenebilirlik:
- Kafka, dağıtık bir yapı üzerine kurulduğundan çok yüksek hacimli verileri işleyebilir ve ihtiyaç duyulduğunda yatay olarak ölçeklenebilir.
Spring Boot ile Apache Kafka Kullanımı
Spring Boot, Kafka ile entegrasyonu kolaylaştıran hazır araçlar sunar. Spring for Apache Kafka kütüphanesi, Spring Boot projelerinde Kafka ile mesaj göndermek ve almak için kullanılabilir.
Spring Boot Projesinde Kafka Bağımlılıkları
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
Kafka Producer ve Consumer Yapılandırması
- Kafka Producer (Üretici) Tanımlama
- @Service
- public class KafkaProducer {
- private final KafkaTemplate<String, String> kafkaTemplate;
- @Autowired
- public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
- this.kafkaTemplate = kafkaTemplate;
- }
- public void sendMessage(String topic, String message) {
- kafkaTemplate.send(topic, message);
- }
- }
- Bu örnekte, KafkaTemplate kullanarak bir mesaj belirli bir konuya (topic) gönderilir.
- Kafka Consumer (Tüketici) Tanımlama
- @Service
- public class KafkaConsumer {
- @KafkaListener(topics = "your_topic_name", groupId = "your_group_id")
- public void listen(String message) {
- System.out.println("Received message: " + message);
- }
- }
- Burada, @KafkaListener anotasyonu ile belirli bir konudan mesajlar dinlenir. groupId, tüketici grubunu belirtir. Bir grup içindeki tüketiciler mesajları sırayla alır, yani her mesaj yalnızca bir tüketici tarafından işlenir.
Kafka Yapılandırması (application.yml)
spring:
kafka:
bootstrap-servers: localhost:9092
consumer:
group-id: your_group_id
auto-offset-reset: earliest
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
- bootstrap-servers: Kafka broker’ların adresini belirtir.
- key-serializer ve value-serializer: Mesajların Kafka’ya gönderilmeden önce serileştirilmesini sağlar.
- key-deserializer ve value-deserializer: Mesajların Kafka’dan alınırken serileştirilmesini sağlar.
Apache Kafka Kullanmanın Avantajları
- Yüksek Performans ve Düşük Gecikme:
- Kafka, düşük gecikme süresi ile yüksek hacimli verileri işleyebilir, bu da büyük ölçekli mikroservis mimarilerinde yüksek performans sağlar.
- Dayanıklılık:
- Mesajlar, belirli bir süre veya boyuta kadar Kafka’da saklanır ve tüketiciler bu mesajları daha sonra işleyebilir. Bu, sistemin dayanıklılığını artırır.
- Dağıtık ve Ölçeklenebilir Yapı:
- Kafka, birden fazla broker üzerinde çalışabildiği için dağıtık bir yapıya sahiptir ve yatay olarak ölçeklenebilir.
- Güvenilir Veri Aktarımı:
- Kafka, mesajların sırasını ve teslimatını garanti eder, bu da güvenilir veri aktarımı sağlar.
- Asenkron İletişim ve Olay Odaklı Mimari Desteği:
- Mikroservislerin asenkron bir şekilde iletişim kurmasına olanak tanır ve olay odaklı mimariyi destekler.
Sonuç
Apache Kafka, mikroservis mimarisinde güvenilir, ölçeklenebilir ve yüksek performanslı bir mesajlaşma altyapısı sunarak mikroservisler arasındaki asenkron iletişimi ve veri akışını sağlar. Spring Boot ile entegre edildiğinde, Kafka’nın
özellikleri daha verimli bir şekilde kullanılabilir. Kafka’nın dağıtık yapısı, yüksek hacimli verileri hızlı bir şekilde işleyebilmesi ve olay odaklı mimari desteği sayesinde mikroservisler arasında güçlü bir iletişim ve veri aktarımı çözümü sunar.
6.2 Spring Cloud Stream ile Olay Odaklı Mimariler
Mikroservis mimarisinde, mikroservislerin bağımsız olarak çalışabilmesi ve birbirleriyle etkin bir şekilde iletişim kurabilmesi için olay odaklı (event-driven) bir yapıya ihtiyaç duyulur. Spring Cloud Stream, olay odaklı mimarilerde mikroservisler arasında mesaj alışverişini kolaylaştıran bir Spring projesidir. Spring Cloud Stream, Kafka ve RabbitMQ gibi mesaj aracılarının (message brokers) entegrasyonunu basitleştirir ve mikroservisler arasında veri akışını sağlar.
Spring Cloud Stream Nedir?
Spring Cloud Stream, uygulamaların mesaj tabanlı iletişim sistemleriyle (Kafka, RabbitMQ, Azure Event Hubs gibi) kolayca entegre olmasını sağlayan bir çerçevedir. Bu çerçeve, mikroservislerin veri akışını asenkron olarak yönetmesine olanak tanır ve olay tabanlı iletişim için güçlü bir altyapı sağlar. Spring Cloud Stream ile, olay odaklı mimari yapılandırarak mikroservislerin yüksek performansla ve bağımsız bir şekilde veri alışverişinde bulunmaları sağlanır.
Spring Cloud Stream, mikroservisler arasında veri akışını sağlamak için üç ana bileşene dayanır:
- Binder:
- Mesaj aracısına bağlanma işlemini gerçekleştirir. Örneğin, Kafka veya RabbitMQ gibi farklı mesajlaşma sistemlerine bağlanmak için uygun Binder kullanılır.
- Source (Kaynak):
- Mesajları oluşturup (publish) ilgili konuya (topic) veya sıraya (queue) gönderen bileşendir. Bir olay gerçekleştiğinde, kaynak bileşen bir mesaj üreterek mesajlaşma sistemine gönderir.
- Sink (Hedef):
- Mesajları tüketen (subscribe) bileşendir. Tüketiciler, kaynak tarafından gönderilen mesajları dinleyerek belirli işlemler yapar.
Spring Cloud Stream ile Olay Odaklı Mimarilerin Avantajları
- Asenkron İletişim:
- Mikroservisler arasında asenkron veri akışı sağlar. Bir servis başka bir servisten bağımsız olarak mesajları gönderir veya alır, bu da servislerin birbirlerine doğrudan bağlı olmadan çalışabilmesini sağlar.
- Olay Tabanlı Mimari:
- Mikroservisler arasında gerçekleşen olaylar, diğer mikroservisler tarafından dinlenebilir ve işlenebilir. Örneğin, bir sipariş oluşturulduğunda bu olay sipariş servisi tarafından yayınlanabilir ve envanter servisi tarafından dinlenip işlenebilir.
- Genişletilebilirlik ve Kolay Entegrasyon:
- Kafka veya RabbitMQ gibi farklı mesajlaşma platformlarına kolayca entegre olur. Bu sayede, uygulamanın mesajlaşma altyapısı değiştirildiğinde kodda minimum değişiklik yapılır.
- Yüksek Ölçeklenebilirlik:
- Mesajlaşma sistemi üzerinden gerçekleşen olay tabanlı iletişim, mikroservislerin yatay olarak ölçeklenmesini sağlar. Yeni mikroservisler veya tüketiciler sisteme kolayca eklenebilir.
Spring Cloud Stream Kullanarak Olay Tabanlı Mimari Kurulumu
Spring Cloud Stream kullanarak Kafka veya RabbitMQ gibi bir mesajlaşma sistemi ile entegre bir olay tabanlı mimari kurabilirsiniz. Aşağıda, Spring Cloud Stream ile basit bir olay tabanlı mimarinin nasıl oluşturulabileceği anlatılmaktadır.
Spring Cloud Stream Bağımlılıkları
Spring Cloud Stream ile Kafka veya RabbitMQ gibi mesajlaşma sistemleriyle entegrasyon sağlamak için ilgili bağımlılıkları eklemeniz gerekir. Örneğin, Kafka ile çalışmak için şu bağımlılıkları ekleyin:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-kafka</artifactId>
</dependency>
Eğer RabbitMQ ile çalışmak istiyorsanız, şu bağımlılığı ekleyin:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
1. Mesaj Üreten (Producer) Bir Mikroservis
Spring Cloud Stream ile bir Producer tanımlamak için, @EnableBinding anotasyonu kullanarak kaynak (source) kanalını belirtiriz. Aşağıda örnek bir mesaj üretici (Producer) sınıfı gösterilmiştir:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.stereotype.Service;
@Service
public class MessageProducer {
@Autowired
private StreamBridge streamBridge;
public void sendMessage(String message) {
streamBridge.send("myTopic-out-0", message);
}
}
Bu örnekte StreamBridge, belirtilen kanala (myTopic-out-0) mesaj göndermek için kullanılır. Bu sayede uygulama, myTopic adlı bir konuya mesaj gönderir.
2. Mesaj Dinleyen (Consumer) Bir Mikroservis
Spring Cloud Stream ile bir Consumer tanımlamak için, @EnableBinding anotasyonu ile bir hedef (sink) kanalını belirtiriz. Aşağıda örnek bir mesaj tüketici (Consumer) sınıfı gösterilmiştir:
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import java.util.function.Consumer;
@Service
public class MessageConsumer {
@Bean
public Consumer<String> myTopic() {
return message -> {
System.out.println("Received message: " + message);
};
}
}
Bu örnekte, myTopic adlı bir fonksiyon oluşturulmuştur ve gelen mesajları dinleyerek Received message: <message> çıktısını verir.
3. application.yml Dosyasında Yapılandırma
Kafka için Spring Cloud Stream yapılandırmasını application.yml dosyasında yapabilirsiniz. Örneğin:
spring:
cloud:
stream:
bindings:
myTopic-out-0:
destination: my-topic
content-type: application/json
myTopic-in-0:
destination: my-topic
group: my-group
kafka:
binder:
brokers: localhost:9092
Yapılandırma açıklamaları:
- myTopic-out-0: Mesaj gönderen üretici kanalı belirtir.
- myTopic-in-0: Mesaj dinleyen tüketici kanalı belirtir ve my-group adlı tüketici grubuna bağlıdır.
- destination: Mesajların gönderildiği ve alındığı Kafka konusunun adıdır.
- brokers: Kafka broker’larının adresini belirtir.
Spring Cloud Stream ile Olay Odaklı Mimari Kullanım Senaryoları
- Sipariş ve Envanter Yönetimi:
- Sipariş oluşturma servisi, bir sipariş oluşturulduğunda bu olayı Kafka’ya gönderir. Envanter servisi, bu olayı dinler ve envanteri günceller.
- Kullanıcı Bildirimleri:
- Bir kullanıcı kaydı tamamlandığında bu olay yayınlanır. Bildirim servisi bu olayı dinler ve kullanıcının e-posta adresine bir hoş geldiniz mesajı gönderir.
- Gerçek Zamanlı Analitik:
- Kullanıcı aktiviteleri (giriş yapma, işlem yapma vb.) Kafka’ya gönderilir ve analitik servisi bu olayları dinleyerek kullanıcı davranışlarını analiz eder.
Spring Cloud Stream ile Çalışmanın Avantajları
- Mesaj Aracısından Bağımsızlık:
- Spring Cloud Stream, uygulamaların Kafka, RabbitMQ gibi çeşitli mesajlaşma platformlarına kolayca bağlanmasını sağlar. Bu sayede, mesajlaşma platformu değiştiğinde kodda minimum değişiklik yapılır.
- Kolay Geliştirme ve Test Edilebilirlik:
- Spring Cloud Stream ile mesajlaşma altyapısına odaklanmadan olay odaklı uygulamalar kolayca geliştirilebilir ve test edilebilir.
- Esneklik ve Genişletilebilirlik:
- Olay odaklı mimari, yeni tüketicilerin sisteme kolayca eklenmesini sağlar. Örneğin, bir konuya yeni bir tüketici eklenerek yeni bir işlevsellik kolayca eklenebilir.
- Yatay Ölçeklenebilirlik:
- Mikroservisler yatay olarak ölçeklendirilebilir ve daha fazla tüketici grubu eklenebilir. Bu sayede, yüksek hacimli olaylar daha verimli işlenir.
- Kolay Yapılandırma Yönetimi:
- Spring Cloud Stream, olay akışları ve bağlayıcıları için basit bir yapılandırma sağlar. YAML dosyaları ile farklı ortamlara uygun yapılandırmalar kolayca yapılabilir.
Sonuç
Spring Cloud Stream, mikroservisler arasında olay tabanlı iletişimi sağlayan güçlü bir çerçevedir. Kafka veya RabbitMQ gibi mesajlaşma sistemleriyle kolayca entegre olarak, mikroservislerin birbirleriyle asenkron bir şekilde iletişim kurmasını sağlar. Bu yapı, yüksek performans, esneklik ve
genişletilebilirlik sunar. Olay tabanlı mimari sayesinde mikroservisler, sistemde gerçekleşen olaylara dinamik olarak yanıt verebilir ve bağımsız bir şekilde çalışabilir.
6.3 Veritabanları Arasında Veri Senkronizasyonu
Mikroservis mimarisinde her mikroservisin kendi veritabanına sahip olması, mikroservislerin bağımsız olarak geliştirilmesini ve ölçeklenmesini sağlar. Ancak, bazı durumlarda farklı mikroservislerdeki veritabanları arasında veri tutarlılığını sağlamak için veri senkronizasyonu gerekebilir. Veritabanları arasında veri senkronizasyonu, bir mikroservisteki güncelleme veya değişikliklerin diğer mikroservislerde de güncel olarak yansıtılmasını sağlar.
Veri senkronizasyonu, özellikle aşağıdaki durumlarda kritik önem taşır:
- Dağıtık Veri Yönetimi: Farklı veritabanlarına sahip mikroservisler arasında veri tutarlılığı sağlanmalıdır.
- Gerçek Zamanlı Güncelleme: Bir mikroserviste yapılan veri değişikliklerinin diğer mikroservislerde de anında yansıması istenebilir.
- Veri Yedekleme ve Yüksek Erişilebilirlik: Verilerin yedeklenmesi veya çoğaltılması, kesintisiz hizmet sağlamak için gereklidir.
Veritabanları Arasında Veri Senkronizasyon Yöntemleri
Veritabanları arasında veri senkronizasyonu sağlamak için birkaç farklı yöntem vardır. Bu yöntemler arasında mesajlaşma tabanlı senkronizasyon, veritabanı replikasyonu, Change Data Capture (CDC) gibi teknikler bulunur. İşte bu yöntemlerin detayları:
1. Olay Tabanlı Senkronizasyon (Event-Driven Synchronization)
Olay tabanlı senkronizasyon, bir mikroserviste gerçekleşen veri değişikliklerinin olay olarak yayınlanmasını ve diğer mikroservislerin bu olayları dinleyerek kendi veritabanlarını güncellemesini sağlar. Bu, özellikle asenkron veri senkronizasyonu için uygundur.
- Spring Cloud Stream ve Kafka/RabbitMQ ile: Bir mikroserviste bir veri değişikliği meydana geldiğinde, bu değişiklik bir olay olarak Kafka veya RabbitMQ gibi mesajlaşma sistemlerine gönderilir. Diğer mikroservisler bu olayı dinleyerek veritabanlarını günceller.
Örnek Senaryo:
- Sipariş Servisi: Bir müşteri sipariş verdiğinde, sipariş bilgileri Kafka'ya gönderilir.
- Envanter Servisi: Envanter servisi Kafka’dan gelen sipariş olayını dinleyerek, sipariş edilen ürünlerin stok bilgilerini günceller.
Bu yaklaşımın avantajları:
- Gevşek Bağlantı (Loose Coupling): Mikroservisler arasında doğrudan bir bağımlılık yoktur, sadece olaylara göre işlem yapılır.
- Asenkron Çalışma: Mikroservisler birbirlerini beklemeden veri işlemlerini gerçekleştirebilir.
- Gerçek Zamanlı Güncelleme: Veriler anlık olarak senkronize edilebilir.
2. Change Data Capture (CDC)
Change Data Capture (CDC), veritabanındaki değişikliklerin tespit edilmesini ve bu değişikliklerin diğer mikroservislere yansıtılmasını sağlar. CDC, veritabanı günlüklerini veya değişiklik akışlarını izleyerek, veritabanında meydana gelen tüm ekleme, güncelleme ve silme işlemlerini takip eder ve bu değişiklikleri bir mesaj olarak yayınlar.
Debezium gibi araçlar CDC işlemleri için popülerdir. Debezium, Kafka Connect ile entegre çalışarak veritabanındaki değişiklikleri Kafka’ya gönderir ve diğer mikroservisler bu olayları dinleyerek kendi veritabanlarını güncelleyebilir.
Örnek Senaryo:
- Kullanıcı Servisi: Kullanıcı veritabanında yeni bir kullanıcı eklendiğinde veya güncellendiğinde, Debezium bu değişikliği algılar ve Kafka’ya gönderir.
- Bildirim Servisi: Kafka’dan gelen kullanıcı değişiklik olayını dinleyerek, yeni kullanıcıya hoş geldin e-postası gönderir veya profil güncellemeleri yapar.
Bu yaklaşımın avantajları:
- Veritabanı Bağımsızlığı: Veritabanı değişiklikleri doğrudan yakalanır, mikroservislerde ekstra kod yazılması gerekmez.
- Gerçek Zamanlı Veri Senkronizasyonu: Veritabanında yapılan değişiklikler anında diğer mikroservislere yansıtılabilir.
- Yüksek Performans: CDC, veritabanı günlüklerinden (log) veri çeker, bu nedenle ana veritabanı işlemlerini yavaşlatmaz.
3. Veritabanı Replikasyonu (Database Replication)
Veritabanı replikasyonu, bir veritabanındaki verilerin başka bir veritabanına kopyalanması işlemidir. Replikasyon, özellikle aynı veritabanı yönetim sistemi (DBMS) kullanan dağıtık sistemlerde tercih edilir.
Replikasyon genellikle iki şekilde yapılır:
- Master-Slave Replikasyonu: Bir ana (master) veritabanındaki veriler diğer kopyalara (slave) çoğaltılır. Slave veritabanları genellikle yalnızca okuma işlemleri için kullanılır.
- Master-Master Replikasyonu: İki veya daha fazla veritabanı birbirleriyle senkronize edilir. Bu yaklaşım, her iki veritabanında da veri güncellenmesi gerektiğinde kullanılır.
Örnek Senaryo:
- Satış ve Finans Mikroservisleri: Satış mikroservisi tüm satış verilerini ana veritabanında (master) saklar ve finans mikroservisi aynı veritabanına (slave) replikasyon ile erişir.
Bu yaklaşımın avantajları:
- Tutarlı Veri Kopyaları: Replikasyon, verilerin her iki veritabanında aynı kalmasını sağlar.
- Daha Az Bağlantı İhtiyacı: Mikroservisler birbirlerine doğrudan bağımlı değildir, veritabanları üzerinden veri senkronizasyonu yapılır.
4. API Tabanlı Senkronizasyon
API tabanlı senkronizasyon, mikroservisler arasında veri senkronizasyonu için HTTP API çağrılarını kullanır. Veri bir mikroserviste güncellendiğinde, bu servisin API’ı üzerinden diğer mikroservisler bilgilendirilir.
Örnek Senaryo:
- Envanter ve Sipariş Mikroservisleri: Sipariş servisi yeni bir sipariş oluşturduğunda, envanter servisine bir API çağrısı yaparak stok miktarını güncellemesini sağlar.
Bu yaklaşımın avantajları:
- Basit ve Etkili: Küçük sistemlerde veya veri güncellemelerinin sık olmadığı durumlarda hızlıca uygulanabilir.
- Doğrudan İletişim: Mikroservisler arasında doğrudan veri güncellemesi yapılabilir.
Dezavantajları:
- Senkron İletişim: API çağrıları genellikle senkron çalışır, bu da bekleme sürelerine neden olabilir.
- Bağımlılık: Mikroservisler arasında doğrudan bağlantı olduğu için bir servis arızalandığında tüm sistem etkilenebilir.
Hangi Yöntem Ne Zaman Tercih Edilmeli?
- Gerçek Zamanlı Veri Senkronizasyonu: Veri değişikliklerinin anında diğer mikroservislerde güncellenmesi gerekiyorsa, Olay Tabanlı Senkronizasyon veya CDC yöntemleri tercih edilir.
- Veritabanı Tabanlı Senkronizasyon: Mikroservislerin aynı DBMS ile çalıştığı ve aynı veri kopyasına ihtiyaç duyduğu durumlarda, Veritabanı Replikasyonu ideal bir çözümdür.
- Basit ve Küçük Sistemlerde Veri Güncellemesi: Küçük sistemlerde veri senkronizasyonu ihtiyacı varsa, API Tabanlı Senkronizasyon hızlı bir çözüm sunar.
- Performans ve Dayanıklılık: CDC gibi log tabanlı araçlar, yüksek performanslı senkronizasyon sağlar ve mikroservislerin performansını etkilemez.
Spring Boot ile Veri Senkronizasyonu İçin Araçlar
- Spring Cloud Stream:
- Kafka veya RabbitMQ gibi olay aracılarından faydalanarak mikroservisler arasında olay tabanlı veri senkronizasyonu sağlar.
- Debezium:
- Change Data Capture (CDC) işlemleri için popüler bir araçtır ve Kafka Connect ile entegre çalışarak veritabanındaki değişiklikleri Kafka’ya gönderir.
- Spring Data JPA:
- Mikroservisler arasında API tabanlı senkronizasyon yapılırken veritabanı işlemlerini yönetmek için Spring Data JPA kullanılabilir.
Sonuç
Veritabanları arasında veri senkronizasyonu, mikroservis mimarisinde veri tutarlılığını sağlamak için kritik bir işlemdir. Olay tabanlı senkronizasyon, Change Data Capture, veritabanı replikasyonu ve API tabanlı senkronizasyon gibi yöntemler, farklı ihtiyaçlara göre veri senkronizasyonunu sağlar.
7.1 Zipkin ve Sleuth ile Dağıtık İzleme
Mikroservis mimarilerinde, her bir servis bağımsız olarak çalışırken, kullanıcı istekleri genellikle birçok farklı servisten geçer. Bu durum, bir isteğin hangi servisler aracılığıyla geçtiğini ve performans sorunlarının nereden kaynaklandığını izlemeyi zorlaştırır. Spring Cloud Sleuth ve Zipkin, mikroservislerde dağıtık izleme sağlayarak, bir isteğin sistemdeki yolculuğunu takip etmeyi ve olası performans sorunlarını tespit etmeyi kolaylaştırır.
Dağıtık İzleme Nedir?
Dağıtık izleme, bir isteğin sistemdeki mikroservisler arasında izlediği yolun takip edilmesi ve analiz edilmesidir. Dağıtık izleme ile sistemin performansını, her bir servisin yanıt süresini ve sistemin genel sağlığını gözlemleyebiliriz. Bu yöntem sayesinde, mikroservisler arasında bir isteğin gecikmesine veya başarısız olmasına neden olan sorunlar daha kolay tespit edilir.
Spring Cloud Sleuth Nedir?
Spring Cloud Sleuth, mikroservislerde dağıtık izlemeyi kolaylaştıran bir Spring Cloud bileşenidir. Sleuth, bir isteğin izini (trace) sürmek için gereken kimlik bilgilerini (trace ID, span ID) otomatik olarak ekler ve bir isteğin hangi mikroservislerden geçtiğini kaydeder. Bu sayede, bir istek zincirinde hangi servisin ne kadar süre çalıştığı ve yanıt verdiği kolayca izlenebilir.
- Trace ID: Bir isteğin sistemdeki tüm yolculuğunu tanımlayan benzersiz bir kimliktir. Tüm mikroservisler, aynı Trace ID kullanarak isteğin tek bir zincirde olduğunu belirler.
- Span ID: Her bir serviste veya işlemde oluşturulan benzersiz bir kimliktir. Bir isteğin bir mikroserviste ne kadar süreyle işleme alındığını gösterir.
Zipkin Nedir?
Zipkin, mikroservislerde dağıtık izleme verilerini toplayan ve görselleştiren bir izleme sistemidir. Zipkin, Sleuth tarafından gönderilen izleme verilerini alır, saklar ve analiz edilmesi için kullanıcıya sunar. Zipkin, bir isteğin hangi mikroservislerden geçtiğini, her bir mikroservisin yanıt süresini ve potansiyel performans sorunlarını gösterir.
Zipkin’in sunduğu temel özellikler:
- Zaman Grafiği (Timeline): Bir isteğin mikroservisler arasındaki yolculuğunu gösterir.
- Gecikme Analizi: Hangi servisin daha fazla yanıt süresine sahip olduğunu göstererek performans sorunlarını tespit eder.
- Kapsam (Scope) Tanımlama: Bir isteğin tüm bileşenlerde nasıl bir yol izlediğini analiz eder.
Spring Cloud Sleuth ve Zipkin ile Dağıtık İzleme Kurulumu
Mikroservislerde dağıtık izleme kurmak için Sleuth ve Zipkin’i birlikte kullanabilirsiniz. Spring Cloud Sleuth, mikroservislerden izleme verilerini toplar ve bu verileri Zipkin sunucusuna gönderir. Zipkin ise bu verileri analiz eder ve kullanıcıya sunar.
1. Spring Boot Projesine Sleuth ve Zipkin Bağımlılıklarını Ekleyin
Spring Cloud Sleuth ve Zipkin’i entegre etmek için projenize aşağıdaki bağımlılıkları ekleyin:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
Bu bağımlılıkları ekleyerek Sleuth ile izleme kimliklerini otomatik olarak ekleyebilir ve Zipkin ile bu verileri toplayabilirsiniz.
2. Zipkin Sunucusunu Başlatın
Zipkin sunucusunu yerel ortamda çalıştırmak için, Docker kullanarak Zipkin sunucusunu başlatabilirsiniz:
docker run -d -p 9411:9411 openzipkin/zipkin
Bu komut, Zipkin sunucusunu http://localhost:9411 adresinde çalıştırır.
3. Sleuth ve Zipkin Yapılandırması (application.yml)
Sleuth ve Zipkin entegrasyonunu yapılandırmak için application.yml dosyanıza aşağıdaki yapılandırmayı ekleyin:
spring:
zipkin:
base-url: http://localhost:9411
sender:
type: web
sleuth:
sampler:
probability: 1.0
Bu yapılandırmada:
- base-url: Zipkin sunucusunun adresini belirtir.
- sampler.probability: İzlenecek isteklerin oranını belirler. 1.0 değeri, tüm isteklerin izleneceği anlamına gelir.
4. Dağıtık İzlemeyi Test Etme
Spring Boot uygulamanızda bir istek yaptığınızda, Sleuth otomatik olarak her isteğe bir trace ID ve span ID ekleyecektir. İsteklerinizin izini Zipkin üzerinden görmek için http://localhost:9411 adresine gidin.
- Trace ID ve Span ID’leri Zipkin’in arayüzünde görebilirsiniz. Bu sayede, bir isteğin hangi mikroservislerden geçtiğini ve her bir servisin yanıt süresini analiz edebilirsiniz.
5. HTTP İsteklerine İzleme Bilgisi Eklenmesi
Sleuth, bir isteğe ait trace ID ve span ID bilgilerini otomatik olarak ekler. Bu sayede, bir mikroservis başka bir mikroservise HTTP isteği gönderdiğinde, Sleuth bu isteğe izleme bilgilerini dahil eder. Örneğin, RestTemplate veya WebClient kullanarak yapılan bir istekte izleme bilgileri otomatik olarak eklenir.
@Autowired
private RestTemplate restTemplate;
public String callAnotherService() {
return restTemplate.getForObject("http://other-service/api", String.class);
}
Bu istek other-service adlı mikroservise gönderildiğinde, Sleuth trace ID ve span ID bilgilerini otomatik olarak ekleyerek isteğin izlenmesini sağlar.
Spring Cloud Sleuth ve Zipkin’in Avantajları
- Detaylı İzleme ve Performans Analizi:
- Her bir isteğin hangi mikroservislerden geçtiğini ve her bir servisin yanıt süresini analiz ederek, performans sorunlarını tespit edebilirsiniz.
- Kolay Sorun Tespiti:
- Bir isteğin başarısız olduğu noktayı belirlemek veya sistemdeki yavaşlıkları tespit etmek için izleme bilgilerini kullanabilirsiniz.
- Otomatik İzleme:
- Sleuth, izleme bilgilerini otomatik olarak isteklere ekler, bu sayede manuel bir işlem yapılmasına gerek kalmaz.
- Görselleştirme ile Kolay Analiz:
- Zipkin, dağıtık izleme verilerini görselleştirerek analiz etmeyi kolaylaştırır. Bu, sistemdeki performans sorunlarının görsel olarak tespit edilmesini sağlar.
- Ölçeklenebilirlik:
- Sleuth ve Zipkin, büyük ölçekli mikroservis mimarilerinde etkin bir izleme sağlar. Birçok mikroservisin aynı anda izlenmesi mümkündür.
Zipkin ve Sleuth Kullanım Senaryoları
- Performans Sorunlarını Tespit Etme:
- Bir isteğin hangi serviste yavaşladığını analiz edebilir ve performans darboğazlarını kolayca tespit edebilirsiniz.
- Hata İzleme ve Loglama:
- Bir isteğin geçtiği tüm servisleri ve hata oluşan noktayı analiz ederek, sistemin daha güvenilir hale gelmesini sağlayabilirsiniz.
- Mikroservisler Arası İletişimi Görselleştirme:
- Bir isteğin sistemdeki yolculuğunu görselleştirerek, mikroservisler arasındaki ilişkileri ve veri akışını analiz edebilirsiniz.
Alternatif Araçlar
Zipkin ve Sleuth dışında, dağıtık izleme için aşağıdaki araçlar da popülerdir:
- Jaeger: CNCF (Cloud Native Computing Foundation) tarafından desteklenen bir izleme çözümüdür. OpenTracing standardını destekler ve yüksek performanslı bir dağıtık izleme sağlar.
- ELK Stack: Elasticsearch, Logstash ve Kibana kombinasyonu ile log analitiği yapılabilir, ancak özel izleme için ek yapılandırmalar gereklidir.
Sonuç
Spring Cloud Sleuth ve Zipkin, mikroservislerde dağıtık izleme sağlayarak bir isteğin tüm sistem boyunca izlenmesini ve analiz edilmesini kolaylaştırır. Sleuth ile otomatik olarak izleme bilgileri eklenir ve Zipkin ile bu veriler analiz edilerek performans sorunları tespit edilir. Dağıtık izleme, mikroservis mimarisinde performans optimizasyonu, sorun giderme ve
sistemdeki gecikmelerin tespit edilmesi için kritik bir öneme sahiptir.
7.2 Prometheus ve Grafana ile İzleme ve Analitik
Mikroservis mimarisinde, her bir servis bağımsız olarak çalışırken, sistemin performansını ve sağlığını izlemek oldukça önemlidir. Prometheus ve Grafana, mikroservislerin izlenmesi ve analiz edilmesi için güçlü bir izleme ve görselleştirme çözümü sunar. Prometheus, verileri toplama ve saklama işlevini üstlenirken, Grafana bu verileri görselleştirerek kullanıcı dostu bir arayüzde analiz edilmesini sağlar.
Prometheus Nedir?
Prometheus, bir açık kaynak izleme ve alarm sistemi olarak geliştirilmiştir. Dağıtık sistemlerdeki uygulamaların metriklerini toplar ve bu verileri analiz etmek için kullanıcılara sunar. Prometheus, özellikle mikroservis mimarilerinde sistem performansını izlemek ve potansiyel sorunları tespit etmek için ideal bir çözümdür.
Prometheus’un temel özellikleri:
- Zaman Serisi Veritabanı: Prometheus, her bir metriği belirli zaman aralıklarında toplar ve bu verileri bir zaman serisi veritabanında saklar.
- Metrik Odaklı İzleme: Mikroservislerin performansını CPU, bellek, yanıt süresi gibi çeşitli metriklerle izler.
- Pull Model: Prometheus, monitör edilen hedeflerden (targets) verileri “pull” yöntemiyle toplar.
- PromQL: Prometheus’un sorgulama dili olan PromQL, topladığı verileri analiz etmek için kullanılır.
- Alarm Yönetimi: Prometheus, metriklere dayalı olarak alarm kuralları oluşturabilir ve uyarı mekanizmaları sağlayabilir.
Grafana Nedir?
Grafana, Prometheus gibi veri kaynaklarından gelen verileri görselleştirerek kullanıcıların analiz etmesine yardımcı olan bir açık kaynak veri görselleştirme platformudur. Grafana, gösterge panoları (dashboard) oluşturmanıza ve Prometheus tarafından toplanan verileri farklı grafiklerle sunmanıza olanak tanır.
Grafana’nın sunduğu özellikler:
- Esnek Panolar: Farklı veri kaynaklarından gelen verilerle özelleştirilebilir panolar oluşturabilirsiniz.
- Veri Kaynağı Desteği: Prometheus dışında InfluxDB, Elasticsearch, MySQL gibi birçok veri kaynağını destekler.
- Alarm Yönetimi: Belirli metrikler için uyarılar ve alarmlar tanımlayabilirsiniz.
- Kullanıcı Dostu Arayüz: Grafikler, tablolar, ölçüm araçları gibi çeşitli görselleştirme araçları sunar.
Prometheus ve Grafana ile İzleme ve Analitik Kurulumu
Mikroservislerde Prometheus ve Grafana kullanarak izleme yapabilmek için aşağıdaki adımları izleyebilirsiniz:
1. Prometheus ve Grafana’nın Kurulumu
Prometheus ve Grafana’yı Docker kullanarak kurmak oldukça kolaydır. Her iki aracı da Docker konteynerleri içinde çalıştırabilirsiniz.
- Prometheus’u Başlatın:
- docker run -d --name=prometheus -p 9090:9090 prom/prometheus
- Grafana’yı Başlatın:
- docker run -d --name=grafana -p 3000:3000 grafana/grafana
Prometheus, http://localhost:9090 adresinde, Grafana ise http://localhost:3000 adresinde çalışacaktır.
2. Spring Boot Uygulaması için Actuator ve Prometheus Bağımlılıkları
Spring Boot uygulamanızda Prometheus’a özel metrikler sağlayabilmek için spring-boot-starter-actuator ve micrometer-registry-prometheus bağımlılıklarını ekleyin.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Bu bağımlılıklar sayesinde Spring Boot uygulamanız, Prometheus için gerekli olan metrikleri /actuator/prometheus endpoint’i aracılığıyla sunacaktır.
3. Spring Boot Uygulamasını Yapılandırma (application.yml)
Actuator endpointlerini etkinleştirmek için application.yml dosyanıza aşağıdaki yapılandırmayı ekleyin:
management:
endpoints:
web:
exposure:
include: "*"
metrics:
tags:
application: my-application
Bu yapılandırma, /actuator/prometheus dahil tüm Actuator endpointlerini açacaktır.
4. Prometheus Konfigürasyonu
Prometheus’un Spring Boot uygulamasından veri çekebilmesi için, prometheus.yml adında bir konfigürasyon dosyası oluşturun ve hedef (target) olarak Spring Boot uygulamanızın /actuator/prometheus endpointini ekleyin.
Örnek prometheus.yml dosyası:
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'spring-boot-app'
static_configs:
- targets: ['host.docker.internal:8080']
Bu yapılandırmada:
- scrape_interval: Prometheus’un verileri hangi sıklıkla çekeceğini belirtir.
- targets: İzlenecek Spring Boot uygulamasının endpoint’ini belirtir (host.docker.internal:8080).
Prometheus’u bu yapılandırmayla başlatmak için şu komutu kullanın:
docker run -d --name=prometheus -p 9090:9090 -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
5. Grafana’da Prometheus Veri Kaynağını Ekleme
Grafana’yı başlattıktan sonra, http://localhost:3000 adresine gidin ve varsayılan kullanıcı adı admin ve parola admin ile giriş yapın.
- Data Sources bölümüne gidin ve yeni bir veri kaynağı ekleyin.
- Prometheus’u veri kaynağı olarak seçin.
- Prometheus’un URL’sini http://localhost:9090 olarak ayarlayın ve kaydedin.
6. Grafana’da Gösterge Panosu (Dashboard) Oluşturma
Grafana’da Prometheus tarafından toplanan metrikleri görselleştirmek için bir gösterge panosu oluşturabilirsiniz:
- Create → Dashboard seçeneğine gidin ve yeni bir gösterge panosu oluşturun.
- Grafikte kullanmak istediğiniz metriği seçin. Örneğin, http_server_requests_seconds_count gibi bir Spring Actuator metriğini kullanabilirsiniz.
- Paneli ekleyin ve görselleştirme seçeneklerini ihtiyaçlarınıza göre özelleştirin.
Grafana, Prometheus metrikleri için birçok hazır gösterge panosu sunar. Örneğin, "Spring Boot Statistics" veya "JVM Metrics" gibi hazır panoları da yükleyebilirsiniz.
Prometheus ve Grafana ile İzleme Yapmanın Avantajları
- Gerçek Zamanlı İzleme:
- Prometheus, belirli aralıklarla veri toplayarak anlık performans bilgilerini gösterir. Grafana ile bu verileri grafikler ve göstergelerle izleyebilirsiniz.
- Uyarılar ve Alarmlar:
- Prometheus, belirli metrikler için alarm kurallarını destekler. Örneğin, CPU kullanımının belirli bir eşiği geçmesi durumunda uyarılar oluşturabilirsiniz.
- Esnek Veri Görselleştirme:
- Grafana, Prometheus’tan aldığı verileri çeşitli grafik ve tablolarla sunarak performans analizini kolaylaştırır.
- Kapsamlı Analiz:
- Metriklerin detaylı bir şekilde analiz edilmesi, sistemdeki performans sorunlarının ve darboğazların tespit edilmesine olanak tanır.
- Kolay Entegrasyon ve Genişletilebilirlik:
- Prometheus ve Grafana, birçok veri kaynağı ve uygulama ile uyumlu çalışır ve bu sayede geniş bir ekosisteme kolayca entegre edilebilir.
Prometheus ve Grafana Kullanım Senaryoları
- Mikroservislerin Performans İzlemesi:
- Her bir mikroservisin CPU, bellek kullanımı, yanıt süreleri gibi metrikleri izlenebilir.
- API Yanıt Sürelerinin İzlenmesi:
- API’lerin yanıt süreleri izlenerek yavaş çalışan API’ler tespit edilebilir.
- Ölçeklendirme Kararları:
- Mikroservislerin yük durumu analiz edilerek yatay veya dikey ölçeklendirme kararları verilebilir.
- Alarm Yönetimi ve Sorun Giderme:
- Belirli metriklerde eşik değerlerin aşılması durumunda alarm üretilir. Bu sayede, sorunları erken tespit ederek hızlı müdahale edebilirsiniz.
Sonuç
Prometheus ve Grafana, mikroservis mimarisinde güçlü bir izleme ve analiz çözümü sunar. Prometheus, sistem metriklerini toplayarak zaman serisi veritabanında saklar; Grafana ise bu verileri görselleştirerek analiz etmeyi kolaylaştırır. Mikroservislerin performansının izlenmesi, sorunların hızlıca tespit edilmesi ve kullanıcı dostu bir arayüz ile görselleştirilmesi için Prometheus ve Grafana ideal araçlardır. Bu kombinasyon, özellikle büyük ölçekli mikroservis mimarilerinde performans ve sağlık takibi açısından vazgeçilmezdir.
7.3 Log Yönetimi ve ELK Stack Entegrasyonu
Mikroservis mimarisinde her mikroservisin kendi loglarını tutması, hataların ve performans sorunlarının tespitini zorlaştırabilir. Dağıtık bir sistemde logların merkezi bir noktada toplanması ve analiz edilmesi, hem sistemin performansını izlemek hem de sorun gidermek açısından oldukça önemlidir. ELK Stack (Elasticsearch, Logstash, Kibana), mikroservislerin loglarını merkezi bir yerde toplamak, analiz etmek ve görselleştirmek için kullanılan popüler bir çözümdür.
ELK Stack Nedir?
ELK Stack, Elasticsearch, Logstash ve Kibana araçlarının bir araya gelmesiyle oluşan bir log yönetim ve analiz çözümüdür:
- Elasticsearch: Dağıtık bir arama ve analiz motorudur. Log verilerini yüksek performansla saklar ve üzerinde hızlı sorgular yapılmasını sağlar.
- Logstash: Log verilerini toplar, filtreler ve Elasticsearch’e iletir. Verileri dönüştürme ve zenginleştirme işlevi görür.
- Kibana: Elasticsearch verilerini görselleştiren bir araçtır. Log verileri üzerinde grafikler, tablolar ve gösterge panoları oluşturmanıza olanak tanır.
ELK Stack, merkezi log yönetimi sağlar ve büyük ölçekli mikroservis sistemlerinde logların analiz edilmesi ve görselleştirilmesi için güçlü bir çözüm sunar.
ELK Stack’in Avantajları
- Merkezi Log Yönetimi: Mikroservislerin logları merkezi bir platformda toplanarak analiz edilir, böylece logların tek bir noktadan yönetilmesi sağlanır.
- Detaylı Arama ve Filtreleme: Elasticsearch sayesinde loglar üzerinde hızlı ve detaylı sorgular yapılabilir.
- Görselleştirme: Kibana ile loglar üzerinde grafikler, tablolar ve gösterge panoları oluşturarak log verileri kolayca analiz edilebilir.
- Gerçek Zamanlı İzleme: Loglar gerçek zamanlı olarak toplanır ve analiz edilir, bu sayede anlık hatalar ve performans sorunları hızlıca tespit edilebilir.
- Genişletilebilirlik: ELK Stack, büyük veri kümelerini yüksek performansla işleyebilir ve yatay olarak ölçeklenebilir.
ELK Stack ile Mikroservis Log Yönetimi Kurulumu
Mikroservislerin loglarını ELK Stack kullanarak merkezi bir noktada toplamak için aşağıdaki adımları takip edebilirsiniz.
1. ELK Stack Bileşenlerini Kurma
ELK Stack bileşenlerini Docker kullanarak kurabilirsiniz. Aşağıdaki komutlar ile Elasticsearch, Logstash ve Kibana’yı Docker konteynerleri olarak çalıştırabilirsiniz:
- Elasticsearch Başlatın:
- docker run -d --name elasticsearch -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.10.0
- Logstash Başlatın:
- docker run -d --name logstash -p 5044:5044 -p 9600:9600 -v $(pwd)/logstash.conf:/usr/share/logstash/pipeline/logstash.conf logstash:7.10.0
- Kibana Başlatın:
- docker run -d --name kibana -p 5601:5601 --link elasticsearch:kibana elasticsearch:7.10.0
- Kibana’ya Erişin: Kibana, http://localhost:5601 adresinde çalışacaktır. Buradan Elasticsearch üzerinde bulunan log verilerini görselleştirebilir ve analiz edebilirsiniz.
2. Logstash Konfigürasyonu (logstash.conf)
Logstash, mikroservislerden gelen logları filtreler ve Elasticsearch’e iletir. Bu amaçla, Logstash için bir konfigürasyon dosyası (logstash.conf) oluşturun. Aşağıda, temel bir Logstash konfigürasyon örneği verilmiştir:
input {
beats {
port => 5044
}
}
filter {
json {
source => "message"
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "microservice-logs-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug }
}
Bu konfigürasyon:
- input: Mikroservislerden gelen logları alır. Burada Filebeat aracılığıyla gönderilen loglar beats protokolü üzerinden alınır.
- filter: JSON formatında olan logları işler.
- output: İşlenen logları Elasticsearch’e gönderir ve microservice-logs adlı bir indeks oluşturur.
3. Mikroservislerden Logları Toplamak İçin Filebeat Kullanımı
Filebeat, log dosyalarını okuyup Logstash’e gönderen hafif bir log taşıma aracıdır. Mikroservislerin loglarını toplamak ve ELK Stack’e iletmek için Filebeat kullanabilirsiniz.
Filebeat yapılandırması için filebeat.yml dosyasını oluşturun:
filebeat.inputs:
- type: log
enabled: true
paths:
- /path/to/microservice/logs/*.log
output.logstash:
hosts: ["localhost:5044"]
Bu yapılandırmada:
- paths: Filebeat’in izleyeceği log dosyalarının yolunu belirtir. Örneğin, mikroservis log dosyalarının bulunduğu dizin.
- output.logstash: Log verilerinin Logstash’e gönderileceği adresi belirtir.
Filebeat’i başlatmak için şu komutu kullanabilirsiniz:
docker run -d --name filebeat --volume="$(pwd)/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro" --volume="/path/to/microservice/logs:/var/log/microservices" docker.elastic.co/beats/filebeat:7.10.0
4. Spring Boot Uygulamasında Logback Yapılandırması
Spring Boot projelerinde logları JSON formatında kaydetmek, ELK Stack entegrasyonunu kolaylaştırır. Logback yapılandırması için logback-spring.xml dosyasını oluşturun:
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/microservice.log</file>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"/>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/microservice-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>7</maxHistory>
</rollingPolicy>
</appender>
<root level="info">
<appender-ref ref="console"/>
<appender-ref ref="file"/>
</root>
</configuration>
Bu yapılandırma:
- Logların JSON formatında kaydedilmesini sağlar.
- Log dosyaları günlük olarak döndürülür (daily rotation), böylece dosya boyutunun artması önlenir.
5. Kibana ile Logları Görselleştirme
Kibana arayüzünde, Discover sekmesine giderek Elasticsearch’te toplanan logları inceleyebilirsiniz.
- Index Pattern Oluşturma: Kibana’ya ilk kez giriş yaptığınızda, microservice-logs-* gibi bir index pattern oluşturun. Bu pattern, Elasticsearch’te toplanan mikroservis loglarını Kibana’da görebilmenizi sağlar.
- Dashboard ve Görselleştirme: Log verilerini analiz etmek için grafikler, tablolar veya diğer görselleştirmeleri içeren panolar oluşturabilirsiniz. Örneğin, hatalı loglar, uyarılar veya performans metrikleri için özel panolar oluşturabilirsiniz.
ELK Stack ile Log Yönetimi Kullanım Senaryoları
- Hata İzleme ve Sorun Giderme:
- Tüm mikroservis loglarını tek bir platformda toplamak, sistemde oluşan hataların kaynağını daha hızlı bulmayı sağlar.
- Performans İzleme:
- Log verilerini analiz ederek sistemdeki performans sorunlarını ve darboğazları tespit edebilirsiniz. Örneğin, yanıt süresi yüksek olan API çağrıları gibi.
- Güvenlik İzleme:
- Güvenlikle ilgili logları analiz ederek güvenlik açıklarını tespit edebilir ve şüpheli işlemleri izleyebilirsiniz. Örneğin, başarısız oturum açma girişimlerini takip etmek.
- Uyarı ve Alarm Yönetimi:
- Loglarda belirli olaylar (örneğin, 500 hata kodları) meydana geldiğinde ELK Stack üzerinden uyarılar alarak hızlıca müdahale edebilirsiniz.
Sonuç
ELK Stack, mikroservislerde merkezi log yönetimi ve analiz için güçlü bir çözümdür. Logların merkezi bir platformda toplanması, sistemdeki hataların, performans sorunlarının ve güvenlik açıklarının hızlı bir şekilde tespit edilmesini sağlar. ELK Stack ile oluşturulan görselleştirmeler, mikroservislerin sağlığını ve performansını sürekli olarak izleyebilmenize olanak tanır. Bu, büyük ölçekli ve karmaşık mikroservis mimarilerinde oldukça değerli bir araçtır.
8.1 Docker ve Kubernetes Temelleri
Modern uygulama geliştirme ve dağıtım süreçlerinde Docker ve Kubernetes gibi konteynerizasyon ve orkestrasyon araçları büyük önem taşır. Mikroservis mimarisinde her servis, bağımsız olarak geliştirilir ve çalıştırılır; Docker bu mikroservislerin izole bir şekilde çalışmasını sağlarken, Kubernetes, konteynerlerin dağıtımını, ölçeklenmesini ve yönetimini kolaylaştırır.
Docker Nedir?
Docker, uygulamaların izole edilmiş ortamlarda (konteynerlerde) çalışmasını sağlayan açık kaynak bir konteyner platformudur. Docker, yazılımın her türlü bağımlılığıyla birlikte paketlenmesini sağlar ve bu paketi farklı sistemlerde aynı şekilde çalıştırır. Bu sayede, geliştirme ortamındaki uygulamanın üretim ortamında aynı şekilde çalışması garanti edilir.
Docker’ın temel özellikleri:
- Konteyner: Uygulamaların tüm bağımlılıklarıyla birlikte çalıştırılmasını sağlayan izole edilmiş ortamlar.
- Image: Bir uygulamanın çalıştırılabilir tüm dosyalarının, bağımlılıklarının ve ayarlarının bulunduğu paket. Konteynerler, Docker image’lerinden oluşturulur.
- Dockerfile: Bir Docker image’in nasıl oluşturulacağını tarif eden dosya. Talimatlar içerir ve image’in otomatik olarak inşa edilmesini sağlar.
Docker ile uygulamalar, farklı ortamlarda çalıştırıldığında bile aynı çıktıyı verecek şekilde izole edilir. Bu, mikroservislerin geliştirilmesi, test edilmesi ve dağıtılması süreçlerinde büyük bir avantaj sağlar.
Docker’ın Temel Bileşenleri
- Docker Image:
- Bir uygulamanın çalıştırılabilir tüm dosyalarının, bağımlılıklarının ve ayarlarının bulunduğu sabit bir dosya. Image’ler Docker Hub gibi merkezlerde saklanabilir.
- Docker Container:
- Bir Docker image’in çalışır durumda olan örneğidir. Bir konteyner, image’ten türetilir ve izole bir ortamda çalışır.
- Dockerfile:
- Docker image’in nasıl oluşturulacağını tarif eden bir dosyadır. Dockerfile, image’in inşa edilmesi için gerekli talimatları içerir.
- Docker Compose:
- Çoklu konteynerli uygulamaları tanımlamak ve çalıştırmak için kullanılan bir araçtır. docker-compose.yml dosyası ile birden fazla konteyneri tek bir komutla yönetebilirsiniz.
Docker ile Çalışma Örneği
Aşağıda basit bir Python uygulamasının Docker konteyneri içinde çalıştırılması için bir örnek verilmiştir:
- Dockerfile Oluşturun:
- # Temel image'i belirtiyoruz
- FROM python:3.8-slim
- # Çalışma dizinini belirliyoruz
- WORKDIR /app
- # Gereksinim dosyalarını kopyalıyoruz ve bağımlılıkları yüklüyoruz
- COPY requirements.txt .
- RUN pip install -r requirements.txt
- # Uygulamayı kopyalıyoruz
- COPY . .
- # Uygulamayı başlatıyoruz
- CMD ["python", "app.py"]
- Docker Image Oluşturun:
- docker build -t my-python-app .
- Docker Container Başlatın:
- docker run -d -p 5000:5000 my-python-app
Bu komutlar, uygulamanın Docker konteyneri içinde çalışmasını sağlar ve localhost:5000 adresinden erişilebilir hale getirir.
Kubernetes Nedir?
Kubernetes (kısaca K8s), Google tarafından geliştirilen ve şu anda CNCF (Cloud Native Computing Foundation) tarafından desteklenen açık kaynak bir konteyner orkestrasyon platformudur. Kubernetes, konteynerlerin otomatik olarak dağıtılması, ölçeklenmesi ve yönetilmesi için kullanılır. Docker konteynerlerinin yönetimi karmaşık hale geldiğinde Kubernetes, bu süreci otomatikleştirir ve büyük ölçekli uygulamalarda konteynerlerin güvenilir bir şekilde çalışmasını sağlar.
Kubernetes’in temel özellikleri:
- Otomatik Konteyner Yönetimi: Konteynerlerin otomatik olarak başlatılması, ölçeklendirilmesi ve kapatılması.
- Yük Dengeleme ve Trafik Yönetimi: Konteynerler arasında trafik yönlendirme ve yük dengeleme yaparak yüksek erişilebilirlik sağlar.
- Öz Düzeltme (Self-Healing): Arızalanan konteynerleri otomatik olarak yeniden başlatma ve başarısız konteynerleri yeniden planlama.
- Küme Yönetimi: Kubernetes, birçok fiziksel veya sanal sunucuyu tek bir küme (cluster) olarak yönetir.
Kubernetes’in Temel Bileşenleri
- Cluster (Küme):
- Kubernetes kümesi, bir grup düğümden oluşur ve konteynerlerin bu düğümler üzerinde çalışmasını sağlar.
- Node:
- Küme içindeki her bir fiziksel veya sanal makine bir düğüm olarak adlandırılır. Düğümler, konteynerleri çalıştıran iş yüklerini barındırır.
- Pod:
- Kubernetes’te çalıştırılan en küçük birimdir. Bir pod, bir veya birden fazla konteyner içerir ve bu konteynerler aynı ağ adresini ve depolama kaynaklarını paylaşır.
- Deployment:
- Kubernetes’te konteyner uygulamalarını yönetmek ve sürümlerini güncellemek için kullanılan bir nesnedir. Deployment, belirli sayıda pod’un çalışmasını garanti eder ve otomatik olarak ölçeklendirme sağlar.
- Service:
- Pod’lar arasında veya dış dünyaya yönelik sabit bir ağ iletişimi sağlayan bir soyutlamadır. Service, pod’ların IP adresleri değişse bile sabit bir adres sağlar.
Kubernetes ile Çalışma Örneği
Aşağıda basit bir Node.js uygulamasının Kubernetes üzerinde çalıştırılması için örnek YAML dosyaları verilmiştir.
- Docker Image’i Oluşturun:
- Önce Node.js uygulaması için Docker image oluşturun ve bir Docker Hub veya özel bir konteyner kaydına (container registry) gönderin.
- docker build -t my-node-app .
- docker tag my-node-app your-dockerhub-username/my-node-app
- docker push your-dockerhub-username/my-node-app
- Kubernetes Deployment Dosyasını Yazın (deployment.yaml):
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: node-app-deployment
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: node-app
- template:
- metadata:
- labels:
- app: node-app
- spec:
- containers:
- - name: node-app
- image: your-dockerhub-username/my-node-app
- ports:
- - containerPort: 3000
- Bu YAML dosyası, Kubernetes’te node-app-deployment adlı bir dağıtım oluşturur ve aynı anda üç pod çalıştırır.
- Kubernetes Service Dosyasını Yazın (service.yaml):
- apiVersion: v1
- kind: Service
- metadata:
- name: node-app-service
- spec:
- selector:
- app: node-app
- ports:
- - protocol: TCP
- port: 80
- targetPort: 3000
- type: LoadBalancer
- Bu Service nesnesi, pod’ları bir arada toplar ve dış dünyaya bir IP adresi ile erişim sağlar.
- Kubernetes Konfigürasyonlarını Uygulamak:
- Kubernetes kümenizde bu konfigürasyonları çalıştırmak için aşağıdaki komutları kullanın:
- kubectl apply -f deployment.yaml
- kubectl apply -f service.yaml
Bu komutlar ile node-app-deployment ve node-app-service nesneleri oluşturulur. Kubernetes, üç pod’un her birinde Node.js uygulamanızı çalıştırır ve dış dünyadan erişim sağlamak için bir yük dengeleyici (LoadBalancer) oluşturur.
Docker ve Kubernetes Kullanmanın Avantajları
- Taşınabilirlik:
- Docker, uygulamaları tüm bağımlılıklarıyla birlikte paketlediği için aynı konteyner her ortamda çalışabilir. Kubernetes ise bu konteynerlerin yönetimini otomatikleştirir.
- Ölçeklenebilirlik:
- Kubernetes, uygulamaların ihtiyaç duyduğu kaynakları otomatik olarak ölçeklendirir. İstekler arttığında daha fazla pod oluşturur ve iş yükünü dengeler.
- Güvenilirlik ve Yüksek Erişilebilirlik:
- Kubernetes, pod’ları otomatik olarak yeniden başlatarak, başarısız olan pod’ları tekrar çalıştırarak sistemin sürekli olarak çalışmasını sağlar.
- Kaynak Verimliliği:
- Kubernetes, iş yüklerini dağıtarak kaynakları verimli
bir şekilde kullanır ve sunucu kaynaklarının boşa gitmesini önler.
- Sürüm Yönetimi ve Dağıtım:
- Kubernetes, yeni sürümleri uygulamak, eski sürümlere geri dönmek ve güncelleme sürecini yönetmek için güçlü araçlar sunar.
Docker ve Kubernetes Kullanım Senaryoları
- Mikroservis Dağıtımları:
- Mikroservis tabanlı uygulamalar Docker konteynerleri içinde paketlenir ve Kubernetes kümesi üzerinde çalıştırılır. Kubernetes, her mikroservis için otomatik ölçeklendirme ve yönetim sağlar.
- DevOps ve CI/CD Süreçleri:
- Docker ve Kubernetes, sürekli entegrasyon ve sürekli dağıtım (CI/CD) süreçlerinde kullanılır. Her kod değişikliği bir konteyner olarak oluşturulur ve Kubernetes kümesine otomatik olarak dağıtılır.
- Otomatik Ölçeklendirme ve Yük Dengeleme:
- Trafik arttığında Kubernetes, otomatik olarak yeni pod’lar oluşturur ve yükü dengeler. Trafik azaldığında ise kaynak kullanımını optimize etmek için pod’ları azaltır.
- Karmaşık Uygulama Yapıları:
- Kubernetes, çoklu hizmetlerin bir arada çalıştığı karmaşık uygulamalarda her bir hizmetin izole bir ortamda çalışmasını sağlar.
Sonuç
Docker ve Kubernetes, mikroservis mimarisinin temel taşlarını oluşturur. Docker, uygulamaları taşınabilir konteynerler içinde çalıştırırken, Kubernetes bu konteynerleri yönetir ve otomatikleştirir. Büyük ölçekli dağıtık sistemlerde, Docker ve Kubernetes, uygulamaların güvenilir, ölçeklenebilir ve sürdürülebilir bir şekilde çalışmasını sağlar. Bu iki teknoloji, modern yazılım geliştirme ve dağıtım süreçlerinin temel taşları haline gelmiştir.
8.2 Mikroservisleri Docker ile Konteynerleştirme
Mikroservis mimarisinde, her bir mikroservis bağımsız olarak geliştirilir, dağıtılır ve çalıştırılır. Docker, bu mikroservislerin her birini izole edilmiş, taşınabilir ve hafif konteynerlerde çalıştırmayı mümkün kılar. Konteynerleştirme sayesinde mikroservislerin bağımlılıkları, konfigürasyonları ve çalıştırma ortamları Docker image’lerinde saklanarak, her ortamda aynı şekilde çalışmaları sağlanır.
Docker, mikroservislerin taşınabilir ve kolayca dağıtılabilir hale gelmesini sağlarken, kaynak kullanımını optimize eder ve geliştirme ile üretim ortamları arasındaki uyumsuzlukları ortadan kaldırır.
Mikroservisleri Neden Docker ile Konteynerleştirmeliyiz?
- Taşınabilirlik: Docker, uygulamanın tüm bağımlılıkları ile birlikte paketlenmesini sağlar, böylece aynı Docker image’i farklı ortamlarda çalıştırabilirsiniz.
- İzole Çalışma Ortamı: Docker konteynerleri izole ortamlarda çalışır, bu sayede bir mikroservisin değişiklikleri diğerlerine etki etmez.
- Kaynak Verimliliği: Konteynerler, sanal makinelere göre daha az kaynak tüketir ve daha hızlı başlar.
- Kolay Dağıtım: Mikroservislerin bir Docker image olarak dağıtılması ve bu image’in hızla yeniden başlatılması ya da ölçeklenmesi kolaydır.
- Versiyonlama ve Güncellemeler: Docker image’ler versiyonlanabilir, böylece belirli bir sürüme geri dönmek veya güncelleme yapmak çok kolaydır.
Docker ile Mikroservislerin Konteynerleştirilmesi Adımları
- Dockerfile Oluşturma
- Docker Image Oluşturma
- Docker Container Çalıştırma
- Docker Compose ile Çoklu Konteyner Yönetimi
Aşağıda, bu adımları Spring Boot ile geliştirilmiş bir örnek mikroservis üzerinde açıklayacağız.
1. Dockerfile Oluşturma
Dockerfile, bir Docker image’in nasıl inşa edileceğini tarif eden dosyadır. Bir Spring Boot mikroservisini konteynerleştirmek için bir Dockerfile oluşturabilirsiniz.
Örnek bir Dockerfile:
# Temel image olarak OpenJDK kullanılır
FROM openjdk:11-jre-slim
# Uygulamanın çalışacağı dizini ayarla
WORKDIR /app
# Jar dosyasını konteynere kopyala
COPY target/my-microservice.jar /app/my-microservice.jar
# Uygulamanın hangi port üzerinden çalışacağını belirt
EXPOSE 8080
# Uygulamayı başlat
ENTRYPOINT ["java", "-jar", "/app/my-microservice.jar"]
Bu Dockerfile, Spring Boot uygulamanızı Java 11 üzerinde çalıştıran bir konteyner oluşturur:
- FROM openjdk:11-jre-slim: Temel olarak hafif bir OpenJDK image’i kullanır.
- WORKDIR /app: Çalışma dizinini /app olarak ayarlar.
- COPY target/my-microservice.jar /app/my-microservice.jar: Derlenen my-microservice.jar dosyasını konteynere kopyalar.
- EXPOSE 8080: Uygulamanın 8080 portunda çalışacağını belirtir.
- ENTRYPOINT: Uygulamanın java -jar komutu ile başlatılmasını sağlar.
2. Docker Image Oluşturma
Dockerfile’i kullanarak Docker image’i oluşturun. Bu işlem, uygulamanızın bağımlılıklarıyla birlikte bir image haline getirilmesini sağlar.
docker build -t my-microservice:1.0 .
Bu komut:
- -t my-microservice:1.0: Image’e my-microservice adını ve 1.0 sürümünü verir.
- .: Dockerfile’in bulunduğu dizinde işlem yapar.
3. Docker Container Çalıştırma
Docker image’i oluşturduktan sonra, bu image’i kullanarak bir konteyner çalıştırabilirsiniz.
docker run -d -p 8080:8080 my-microservice:1.0
Bu komut:
- -d: Konteyneri arka planda çalıştırır.
- -p 8080:8080: Host’un 8080 portunu konteynerin 8080 portuna yönlendirir.
- my-microservice:1.0: Çalıştırılacak image’in adını ve sürümünü belirtir.
Artık mikroservisinize http://localhost:8080 adresinden erişebilirsiniz.
4. Docker Compose ile Çoklu Konteyner Yönetimi
Gerçek mikroservis sistemlerinde birden fazla mikroservis ve veritabanı, mesajlaşma kuyruğu gibi bağımlılıklar birlikte çalışır. Bu tür çoklu konteynerli uygulamalar için Docker Compose kullanılır. Docker Compose, tüm konteynerleri tek bir docker-compose.yml dosyası ile yönetmenizi sağlar.
Örnek docker-compose.yml dosyası:
version: '3'
services:
my-microservice:
image: my-microservice:1.0
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/mydb
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=password
depends_on:
- mysql
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
Bu dosya:
- my-microservice: Spring Boot mikroservisini çalıştırır ve MySQL veritabanına bağlanmasını sağlar.
- mysql: MySQL veritabanını çalıştırır, veritabanı bilgilerini tanımlar ve mikroservise 3306 portundan erişim sağlar.
- depends_on: my-microservice servisini mysql veritabanına bağlı olarak çalıştırır.
Docker Compose Komutları:
- Tüm servisleri çalıştırmak için:
- docker-compose up -d
- Tüm servisleri durdurmak için:
- docker-compose down
Bu komutlarla, my-microservice ve mysql konteynerleri aynı anda başlatılır ve çalıştırılır. http://localhost:8080 adresine giderek mikroservis uygulamanıza erişebilirsiniz.
Mikroservisleri Docker ile Konteynerleştirmenin Avantajları
- Taşınabilirlik ve Uyumluluk:
- Docker image’leri her ortamda aynı şekilde çalışır, böylece geliştirme ve üretim ortamları arasında uyum sağlanır.
- Kolay Dağıtım ve Ölçeklenebilirlik:
- Konteynerler hızlıca başlatılabilir ve çoğaltılabilir, böylece mikroservisler hızlı bir şekilde ölçeklendirilebilir.
- Kaynak İzolasyonu ve Verimliliği:
- Konteynerler birbirinden izole edildiğinden, kaynak kullanımları optimize edilir ve bağımsız olarak yönetilebilir.
- Versiyon Kontrolü:
- Docker image’leri versiyonlanabilir, bu sayede belirli bir sürüm geri yüklenebilir veya farklı sürümler arasında geçiş yapılabilir.
- Kolay Test ve Geliştirme Ortamları:
- Docker Compose ile birden fazla bağımlılığı aynı anda başlatarak, test ve geliştirme ortamları hızlıca oluşturulabilir.
Mikroservislerde Docker Kullanım Senaryoları
- Çoklu Mikroservis Geliştirme:
- Docker Compose kullanarak, her mikroservisi ve bağımlılıklarını aynı anda çalıştırarak geliştirme sürecini hızlandırabilirsiniz.
- Test ve Staging Ortamları:
- Docker konteynerleri hızlı bir şekilde başlatılıp kapatılabilir. Bu, test ve staging ortamlarının hızla oluşturulmasını sağlar.
- CI/CD Süreçlerinde Kullanım:
- Docker image’ler, CI/CD süreçlerinde otomatik olarak oluşturulabilir ve dağıtılabilir, böylece her kod değişikliğinde mikroservisler hızlıca dağıtılabilir.
- Geliştirme ve Üretim Ortamları Arasında Uyumluluk:
- Docker, her ortamda aynı çıktıyı sağlayacak şekilde çalıştığından, geliştirme ve üretim ortamları arasındaki uyumsuzluk sorunları ortadan kalkar.
Sonuç
Docker ile mikroservislerin konteynerleştirilmesi, her bir mikroservisin bağımsız ve izole bir ortamda çalışmasını sağlar. Docker Compose, bu mikroservislerin birlikte çalışmasını kolaylaştır
8.3 Kubernetes ile Mikroservislerin Yönetimi
Mikroservis mimarisinde her servis bağımsız olarak geliştirilir, dağıtılır ve ölçeklenir. Ancak, birden fazla mikroservisin birlikte çalıştığı bir ortamda konteynerleri yönetmek karmaşık bir hale gelir. Kubernetes, bu konteynerleri yönetmek, dağıtmak, ölçeklemek ve izlemek için kullanılan güçlü bir konteyner orkestrasyon platformudur. Kubernetes, özellikle mikroservis tabanlı uygulamalarda konteynerlerin sürekli çalışmasını sağlamak ve kaynakları verimli kullanmak için idealdir.
Kubernetes Nedir?
Kubernetes (K8s), Google tarafından geliştirilmiş ve şu anda Cloud Native Computing Foundation (CNCF) tarafından desteklenen açık kaynak bir konteyner yönetim platformudur. Kubernetes, konteynerleri otomatikleştirir, ölçekler, yük dengeler ve uygulamaların güvenilir bir şekilde çalışmasını sağlar. Kubernetes sayesinde, mikroservislerinizi bir Kubernetes kümesi üzerinde dağıtabilir, güncelleyebilir, hata durumlarında otomatik olarak yeniden başlatabilir ve ölçeklendirebilirsiniz.
Kubernetes’in temel özellikleri:
- Otomatik Konteyner Yönetimi: Uygulamaların sürekli olarak çalışmasını sağlamak için konteynerlerin otomatik başlatılması, durdurulması ve yeniden dağıtılması.
- Yük Dengeleme ve Trafik Yönlendirme: Yükü pod’lar arasında otomatik olarak dengeler ve dış dünyadan gelen trafiği yönlendirir.
- Otomatik Ölçekleme: Sistem kaynaklarına göre otomatik olarak ölçeklendirme yapar.
- Self-Healing: Başarısız olan pod’ları otomatik olarak yeniden başlatır veya düğümler arasında yeniden dağıtır.
- Küme Yönetimi: Kubernetes, fiziksel veya sanal sunucuları bir küme (cluster) olarak yönetir ve bu küme üzerinde konteynerleri dağıtır.
Kubernetes’in Temel Bileşenleri
- Cluster (Küme):
- Kubernetes’in temel yapı taşıdır. Bir Kubernetes kümesi, birçok düğümden (node) oluşur ve her düğüm, konteynerleri çalıştırmak için gerekli kaynakları sağlar.
- Node:
- Kubernetes kümesindeki her bir fiziksel veya sanal makine bir düğümdür. Düğümler, pod’ları çalıştırır ve yönetir.
- Pod:
- Kubernetes’te çalıştırılan en küçük birimdir. Bir pod, bir veya daha fazla konteyner içerir ve bu konteynerler aynı IP adresini ve depolama kaynaklarını paylaşır.
- Deployment:
- Kubernetes’te konteynerlerin sürüm güncellemelerini ve ölçeklendirmeyi yönetmek için kullanılır. Deployment, belirli sayıda pod’un sürekli olarak çalışmasını sağlar ve otomatik olarak yeni pod’ları oluşturur veya günceller.
- Service:
- Pod’ların ağ iletişimini yönetir. Service, pod’lar arasında veya dış dünyaya yönelik sabit bir erişim sağlar ve yük dengeleme işlevi görür.
- ConfigMap ve Secret:
- Uygulamanın konfigürasyon ayarlarını ve hassas bilgilerini (örneğin, API anahtarları, parolalar) yönetmek için kullanılır.
Kubernetes ile Mikroservis Yönetimi
Kubernetes, mikroservisleri bir dizi YAML dosyası kullanarak yönetir. Her mikroservis için bir Deployment, Service ve gerekirse ConfigMap veya Secret nesneleri tanımlanır. Bu nesneler Kubernetes’e mikroservislerin nasıl dağıtılacağını, nasıl iletişim kuracağını ve nasıl ölçekleneceğini belirtir.
Aşağıda, Kubernetes üzerinde bir mikroservisin nasıl yönetileceğine dair örnek bir yapılandırma verilmiştir.
1. Deployment Dosyası
Deployment, pod’ların dağıtılmasını ve güncellenmesini yönetir. Aşağıda, my-microservice adında bir mikroservis için örnek bir Deployment dosyası verilmiştir:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-microservice-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-microservice
template:
metadata:
labels:
app: my-microservice
spec:
containers:
- name: my-microservice
image: your-dockerhub-username/my-microservice:1.0
ports:
- containerPort: 8080
Bu Deployment dosyasında:
- replicas: Bu mikroservisin aynı anda kaç pod örneğinin çalıştırılacağını belirtir.
- image: Pod’da çalıştırılacak Docker image’ini tanımlar.
- containerPort: Pod’un hangi port üzerinden çalışacağını belirtir.
Bu yapılandırma, my-microservice mikroservisinden 3 pod oluşturur ve her bir pod, Docker Hub’da barındırılan my-microservice:1.0 image’ini kullanır.
2. Service Dosyası
Service, Kubernetes’te pod’lar arasında veya dış dünyaya yönelik ağ iletişimini sağlar. Aşağıda, my-microservice için bir Service dosyası örneği verilmiştir:
apiVersion: v1
kind: Service
metadata:
name: my-microservice-service
spec:
selector:
app: my-microservice
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer
Bu Service dosyasında:
- selector: Hangi pod’ların bu Service ile eşleştirileceğini belirtir (app: my-microservice etiketine sahip pod’ları seçer).
- port: Servisin dış dünyaya açılacağı port’u belirtir (burada 80).
- targetPort: Pod’un dinleyeceği port’u belirtir (burada 8080).
- type: LoadBalancer: Dış dünyadan erişim sağlamak için bir yük dengeleyici oluşturur.
Bu yapılandırma, my-microservice pod’larını bir LoadBalancer ile dış dünyaya açar ve gelen trafiği pod’lar arasında dengeler.
3. ConfigMap ve Secret Dosyaları
ConfigMap ve Secret, konfigürasyon verileri ve hassas bilgileri saklamak için kullanılır.
Örnek bir ConfigMap dosyası:
apiVersion: v1
kind: ConfigMap
metadata:
name: my-microservice-config
data:
DATABASE_URL: "jdbc:mysql://mysql-service:3306/mydb"
DATABASE_USER: "user"
Örnek bir Secret dosyası:
apiVersion: v1
kind: Secret
metadata:
name: my-microservice-secret
type: Opaque
data:
DATABASE_PASSWORD: dXNlcnBhc3N3b3Jk
- DATABASE_PASSWORD: Base64 ile şifrelenmiş bir değerdir (echo -n "userpassword" | base64 komutu ile şifrelenir).
- ConfigMap ve Secret dosyaları, pod’lara environment variable olarak eklenebilir ve hassas bilgilerin güvenli bir şekilde saklanmasını sağlar.
4. Kubernetes Yapılandırmalarını Uygulama
YAML dosyalarını Kubernetes kümenize uygulamak için kubectl apply komutunu kullanabilirsiniz:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f configmap.yaml
kubectl apply -f secret.yaml
Bu komutlar, mikroservisinizi Kubernetes kümesi üzerinde çalıştırır ve Service aracılığıyla erişime açar.
Kubernetes ile Mikroservis Yönetiminin Avantajları
- Otomatik Ölçeklendirme:
- Kubernetes, kaynak kullanımına göre pod sayısını otomatik olarak artırabilir veya azaltabilir. Bu, mikroservislerin değişen iş yüklerine uyum sağlamasını sağlar.
- Self-Healing Özellikleri:
- Kubernetes, başarısız olan pod’ları otomatik olarak yeniden başlatır, yeniden planlar ve düğümler arasında dengeler.
- Yüksek Erişilebilirlik ve Yük Dengeleme:
- Kubernetes, aynı mikroservisten birden fazla pod oluşturabilir ve bunlar arasında gelen istekleri dengeler. Bu, yüksek erişilebilirlik sağlar.
- Kolay Sürüm Yönetimi ve Güncellemeler:
- Kubernetes, yeni sürüm güncellemeleri yapmak için Rolling Update ve Canary Deployment gibi özellikler sunar. Eski sürüme dönmek gerektiğinde Rollback işlemi kolaylıkla yapılabilir.
- Kaynak Verimliliği:
- Kubernetes, kaynakları verimli bir şekilde kullanır ve iş yüklerini düğümler arasında dengeler. Bu, sunucu maliyetlerini düşürür.
Kubernetes Kullanım Senaryoları
- Yüksek Trafikli Uygulamalar:
- Kubernetes, gelen yüksek trafiğe yanıt vermek için pod
’ları otomatik olarak ölçeklendirir ve yükü dengeler.
- Sık Güncellenen Mikroservisler:
- Sık sık yeni sürümleri dağıtılan mikroservisler için Kubernetes, sorunsuz güncellemeler ve geri dönüşler sağlar.
- Geliştirme, Test ve Üretim Ortamları:
- Kubernetes, aynı mikroservislerin farklı sürümlerinin aynı anda çalışmasına olanak tanır, bu da geliştirme ve test süreçlerini kolaylaştırır.
- CI/CD Süreçleri:
- Kubernetes, CI/CD süreçlerinde, kod değişikliklerini hızlıca dağıtmak ve test etmek için kullanılabilir.
Sonuç
Kubernetes, mikroservis mimarisinde dağıtılmış konteynerleri yönetmek için güçlü bir platform sunar. Otomatik ölçeklendirme, yük dengeleme, sürüm güncelleme ve self-healing özellikleri sayesinde mikroservislerin güvenilir bir şekilde çalışmasını sağlar. Kubernetes ile, büyük ölçekli mikroservis mimarilerinde uygulama yönetimini, dağıtımını ve güncellemelerini otomatize ederek, kaynak verimliliğini ve sistem performansını artırabilirsiniz.
9.1 Jenkins ile CI/CD Pipeline Kurulumu
Mikroservis tabanlı uygulamalarda, sürekli entegrasyon ve sürekli dağıtım (CI/CD) süreçleri kritik öneme sahiptir. Jenkins, CI/CD işlemlerini otomatikleştirmek için kullanılan açık kaynak bir araçtır. Jenkins ile CI/CD pipeline kurarak, kod değişikliklerini otomatik olarak derleyebilir, test edebilir ve dağıtabilirsiniz. Bu sayede, kodun hızlı ve güvenilir bir şekilde üretim ortamına geçmesi sağlanır.
CI/CD Nedir?
- Sürekli Entegrasyon (Continuous Integration - CI): Geliştiriciler tarafından yapılan kod değişikliklerinin sürekli olarak entegre edilmesi ve bu değişikliklerin otomatik olarak test edilmesi sürecidir.
- Sürekli Dağıtım (Continuous Deployment - CD): CI sürecinden geçen değişikliklerin otomatik olarak test ve üretim ortamlarına dağıtılmasıdır. CD, yazılımın hızlı bir şekilde kullanıcıya ulaşmasını sağlar.
Jenkins ile CI/CD Pipeline Kurmanın Avantajları
- Otomatik ve Hızlı Geri Bildirim: Kod değişiklikleri otomatik olarak test edilir ve geri bildirim hızlıca alınır.
- Kaliteli Kod ve Güvenilir Dağıtım: CI/CD süreçleri sayesinde hatalar hızlı bir şekilde tespit edilir ve dağıtıma güvenilir bir şekilde hazırlanır.
- Sürekli ve Tekrar Edilebilir Süreçler: Jenkins pipeline’ları ile tüm süreçler tekrar edilebilir hale gelir, böylece hata payı azalır.
- Sürüm Yönetimi ve Dağıtım Kolaylığı: Her bir değişiklik ayrı bir sürüm olarak tanımlanabilir ve dağıtılabilir.
Jenkins Kurulumu ve Yapılandırma
Öncelikle Jenkins’i Docker kullanarak kurabilirsiniz. Bu, Jenkins’in hızlı bir şekilde ayağa kaldırılmasını sağlar.
docker run -d -p 8080:8080 -p 50000:50000 --name jenkins jenkins/jenkins:lts
Bu komut, Jenkins’in en son LTS sürümünü http://localhost:8080 adresinde çalıştırır. İlk kez giriş yaparken, Jenkins’in başlangıç şifresini Jenkins konteyner log’larından bulabilirsiniz:
docker logs jenkins
Jenkins Pipeline Nedir?
Jenkins pipeline, yazılım geliştirme ve dağıtım sürecindeki adımları tanımlayan bir yapılandırma dosyasıdır. Pipeline, Declarative ve Scripted olmak üzere iki türde yazılabilir; bu rehberde Declarative Pipeline kullanacağız, çünkü daha kolay ve anlaşılırdır.
Pipeline dosyası, genellikle Jenkinsfile olarak adlandırılır ve proje kök dizininde saklanır. Jenkins, bu dosyayı okuyarak CI/CD sürecini gerçekleştirir.
Basit Bir Jenkins Pipeline Yapısı
Jenkinsfile içinde bir pipeline şu şekilde yapılandırılabilir:
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building...'
// örneğin: sh 'mvn clean package'
}
}
stage('Test') {
steps {
echo 'Testing...'
// örneğin: sh 'mvn test'
}
}
stage('Deploy') {
steps {
echo 'Deploying...'
// örneğin: sh 'docker-compose up -d'
}
}
}
}
Bu Jenkinsfile örneği:
- agent any: Pipeline’in herhangi bir mevcut Jenkins ajanında çalışabileceğini belirtir.
- stages: CI/CD sürecinin farklı adımlarını tanımlar.
- Build: Derleme aşamasıdır; burada uygulama derlenir veya paketlenir.
- Test: Test aşamasıdır; burada birim testleri çalıştırılır.
- Deploy: Dağıtım aşamasıdır; burada üretim veya test ortamına dağıtım yapılır.
Jenkins ile Mikroservis CI/CD Pipeline Kurulumu
Aşağıda bir mikroservis için CI/CD pipeline kurulumuna dair detaylı bir örnek bulunmaktadır. Bu örnekte Spring Boot ile geliştirilmiş bir mikroservis proje adımları gösterilmiştir.
1. Pipeline Ajanını ve Ortamı Belirleyin
pipeline {
agent any
environment {
DOCKER_HUB_REPO = 'your-dockerhub-username/my-microservice'
IMAGE_TAG = "v${env.BUILD_NUMBER}"
}
- DOCKER_HUB_REPO: Docker Hub’daki depo adresini belirtir.
- IMAGE_TAG: Docker image’inin etiketini Jenkins build numarasına göre belirler.
2. Build Aşaması
Spring Boot uygulamanız için mvn clean package komutuyla bir JAR dosyası oluşturun.
stages {
stage('Build') {
steps {
echo 'Building...'
sh 'mvn clean package'
}
}
Bu aşama, proje için gerekli bağımlılıkları indirir, kodu derler ve bir JAR dosyası üretir.
3. Test Aşaması
Mikroservisinizdeki birim testleri çalıştırın.
stage('Test') {
steps {
echo 'Testing...'
sh 'mvn test'
}
}
Bu aşama, birim testleri çalıştırarak kodun testlerden geçtiğinden emin olur.
4. Docker Image Oluşturma ve Pushing (Push Aşaması)
Jenkins pipeline’ının Docker image oluşturup Docker Hub’a yüklemesini sağlayın.
stage('Build Docker Image') {
steps {
echo 'Building Docker image...'
sh "docker build -t ${DOCKER_HUB_REPO}:${IMAGE_TAG} ."
}
}
stage('Push Docker Image') {
steps {
echo 'Pushing Docker image to Docker Hub...'
withCredentials([usernamePassword(credentialsId: 'docker-hub-credentials', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
sh 'docker login -u $DOCKER_USER -p $DOCKER_PASS'
sh "docker push ${DOCKER_HUB_REPO}:${IMAGE_TAG}"
}
}
}
- docker build: Docker image’i oluşturur ve etiketler.
- docker push: Docker Hub’a image’i yükler. Burada, docker-hub-credentials kimlik bilgileriyle Docker Hub’a giriş yapılır.
5. Dağıtım (Deployment) Aşaması
Oluşturulan Docker image’i Kubernetes veya Docker Compose ile dağıtabilirsiniz. Örneğin:
stage('Deploy to Kubernetes') {
steps {
echo 'Deploying to Kubernetes...'
sh 'kubectl apply -f k8s/deployment.yaml'
}
}
}
}
Bu aşamada Kubernetes kümenize kubectl apply -f komutu ile deployment gerçekleştirilir.
Jenkins Pipeline Konfigürasyonunun Jenkins’e Tanıtılması
- Jenkins Web Arayüzünden: Jenkins ana sayfasında New Item seçeneğiyle yeni bir pipeline oluşturun.
- Pipeline Proje Ayarları: Pipeline türünü seçin ve projenin Git deposunu tanımlayın.
- Pipeline Script from SCM: Kaynak kod yönetiminden gelen bir pipeline yapılandırması kullanmak için bu seçeneği işaretleyin ve Jenkinsfile dosyasının yolunu belirtin.
CI/CD Sürecinin Otomasyonu
Yukarıdaki Jenkinsfile, Jenkins’in her kod değişikliğinde derleme, test, image oluşturma ve dağıtım işlemlerini otomatik olarak yapmasını sağlar. Jenkins’in Webhook entegrasyonuyla Git deposuna yapılan her değişiklik otomatik olarak Jenkins pipeline’ını tetikleyebilir.
- GitHub veya GitLab Webhook Kurulumu: Git deposunda Jenkins URL’sini webhook olarak tanımlayın (http://your-jenkins-url/github-webhook/), bu sayede her kod değişikliği otomatik olarak CI/CD pipeline’ını tetikler.
Jenkins Pipeline Avantajları
- Tam Otomatik İş Akışı: Pipeline ile her kod değişikliği test edilir, derlenir ve dağıtılır.
- Hızlı ve Güvenilir Dağıtım: CI/CD süreçleri sayesinde kod değişiklikleri hızlı bir şekilde kullanıcıya ulaşır.
- Versiyon Kontrolü: Docker image’lerinin sürüm etiketleri, Jenkins build numarası ile yönetilebilir.
- Detaylı İzleme ve Geri Bildirim: Jenkins, her aşamanın başarısını veya başarısızlığını raporlar.
Sonuç
Jenkins ile kurulan CI/CD pipeline, mikroservis tabanlı uygulamaların otomatik olarak entegre edilmesini, test edilmesini ve dağıtılmasını sağlar. Bu süreç, kod değişikliklerinin hızlıca test edilip, güvenilir bir şekilde üretim ortamına aktarılmasını mümkün kılar. Jenkins, pipeline otomasyonu ile yazılım geliştirme ve dağıtım süreçlerini kolaylaştırarak, mikroservislerin güncel ve güvenilir bir şekilde kullanıcıya sunulmasını sağlar.
9.2 Spring Cloud ve GitOps Prensipleri
GitOps, uygulama altyapısını ve kodu yönetmek için bir yaklaşım olup, tüm dağıtım ve yapılandırma değişikliklerinin bir sürüm kontrol sistemi (genellikle Git) üzerinden yapılmasını sağlar. Spring Cloud ise dağıtık sistemler ve mikroservis mimarisinde çeşitli altyapı hizmetleri sunarak mikroservislerin kolayca yönetilmesine olanak tanır. GitOps prensipleri ile Spring Cloud birleştiğinde, uygulama dağıtımlarını ve altyapı yapılandırmalarını otomatikleştirip, yönetilebilir ve güvenilir bir hale getirmek mümkün olur.
GitOps’un temel prensipleri, Spring Cloud’un altyapı yönetimi ile birleştiğinde daha kolay bir dağıtım ve yapılandırma yönetim süreci sağlar.
GitOps Nedir?
GitOps, tüm dağıtım ve altyapı değişikliklerinin Git üzerinde yapılan değişikliklerle kontrol edilmesini sağlayan bir yazılım geliştirme ve operasyon yönetim yaklaşımıdır. Bu yaklaşımda, Git deposu hem uygulama kodunu hem de altyapı yapılandırmalarını içerir. Dağıtım ve yapılandırma değişiklikleri, Git üzerinden yapılır ve versiyonlanır. GitOps sayesinde, herhangi bir değişiklik yapılmak istendiğinde bir "pull request" veya "merge" işlemi ile bu değişiklik kaydedilir ve otomatik olarak dağıtım sürecini başlatır.
GitOps’un temel prensipleri şunlardır:
- Sürüm Kontrolü (Version Control): Tüm yapılandırmalar Git’te tutulur, böylece değişiklikler geri alınabilir ve takip edilebilir.
- Otomatikleştirilmiş Dağıtım: Git deposundaki değişiklikler otomatik olarak Kubernetes gibi bir hedef ortama dağıtılır.
- İzlenebilirlik: Tüm değişiklikler Git geçmişinde tutulduğu için neyin, ne zaman ve kim tarafından yapıldığı izlenebilir.
- Deklaratif Yapılandırma: Tüm yapılandırmalar kod olarak (IaC - Infrastructure as Code) tutulur.
Spring Cloud ile GitOps Uygulama
Spring Cloud Config Server ve GitOps entegrasyonu, mikroservislerin yapılandırmalarını merkezi bir yerden yönetmeyi ve bu yapılandırmaları Git deposu üzerinden kontrol etmeyi sağlar.
Spring Cloud Config Server, mikroservislerin yapılandırmalarını merkezi bir konumda toplar ve her servisin kendine ait bir yapılandırma dosyası olmasını sağlar. GitOps prensipleriyle Spring Cloud Config Server birlikte kullanıldığında, mikroservislerin yapılandırmalarında yapılan her değişiklik Git deposu üzerinden yönetilir ve versiyonlanır.
Spring Cloud Config Server ve GitOps Entegrasyonu
- Git Tabanlı Yapılandırma Yönetimi:
- Spring Cloud Config Server, yapılandırma dosyalarını bir Git deposundan okur. Bu, yapılandırmaların Git’te versiyonlanmasını sağlar.
- Mikroservislerin yapılandırmaları değiştiğinde, Git deposuna yapılan değişiklikler otomatik olarak Config Server üzerinden mikroservislere dağıtılır.
- Deklaratif Yapılandırmalar:
- Spring Cloud Config Server’da tüm yapılandırmalar YAML veya properties dosyalarında tanımlanır. Bu yapılandırmalar Git deposunda tutulur ve her değişiklik bir commit ile kaydedilir.
- Otomatik Yeniden Yükleme (Refresh):
- Spring Cloud Bus ile birlikte kullanıldığında, Config Server üzerinde yapılan değişiklikler otomatik olarak tüm mikroservislere iletilir ve yapılandırmalar anında güncellenir.
Spring Cloud Config Server Kurulumu
Spring Cloud Config Server kullanarak yapılandırmaları merkezi bir yerden yönetmek için aşağıdaki adımları izleyebilirsiniz.
- Config Server Bağımlılıklarını Ekleyin:
- pom.xml dosyasına Spring Cloud Config Server bağımlılıklarını ekleyin:
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-config-server</artifactId>
- </dependency>
- Config Server Uygulamasını Tanımlayın:
- @EnableConfigServer anotasyonunu kullanarak Config Server olarak çalışacak Spring Boot uygulamanızı tanımlayın:
- @SpringBootApplication
- @EnableConfigServer
- public class ConfigServerApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConfigServerApplication.class, args);
- }
- }
- Git Tabanlı Yapılandırma Kaynağını Belirtin:
- application.yml dosyasında yapılandırma kaynağı olarak Git deposunu belirtin:
- server:
- port: 8888
- spring:
- cloud:
- config:
- server:
- git:
- uri: https://github.com/username/config-repo
- clone-on-start: true
- Burada:
- uri: Yapılandırmaların bulunduğu Git deposunu belirtir.
- clone-on-start: Uygulama başlatıldığında Git deposunun klonlanmasını sağlar.
- Mikroservislerin Config Server’a Bağlanması:
- Her bir mikroservis, application.yml dosyasına aşağıdaki gibi Config Server bağlantısını eklemelidir:
- spring:
- cloud:
- config:
- uri: http://localhost:8888
- Yapılandırmaları Yönetme:
- Mikroservislerin yapılandırma dosyalarını Git deposunda {servis-adı}-{profil}.yml formatında oluşturabilirsiniz. Örneğin:
- my-microservice-dev.yml
- my-microservice-prod.yml
GitOps Prensipleri ile Spring Cloud Config Server’ın Çalışma Mantığı
- Yapılandırma Değişiklikleri ve Commit İşlemi:
- Yapılandırmalarda bir değişiklik yapıldığında, bu değişiklik Git deposuna commit edilir. Örneğin, bir application-dev.yml dosyasındaki yapılandırma değeri güncellenir ve Git deposuna push edilir.
- Değişikliklerin Dağıtılması:
- Spring Cloud Config Server, Git deposundaki değişiklikleri okur. Spring Cloud Bus ile entegrasyon yapılmışsa, Config Server tüm bağlı mikroservislere bu değişiklikleri bildirir ve mikroservisler yapılandırmalarını otomatik olarak günceller.
- İzlenebilirlik ve Geri Alma:
- Yapılandırma değişiklikleri Git’te versiyonlanır, böylece yapılandırma hataları durumunda önceki bir sürüme geri dönmek kolaydır. Bu sayede, uygulamanın güvenli ve kontrollü bir şekilde yönetilmesi sağlanır.
GitOps ve Spring Cloud Kullanım Senaryoları
- Farklı Ortamlar için Yapılandırma Yönetimi:
- Spring Cloud Config Server, aynı uygulama için farklı ortamlar (dev, test, prod) için yapılandırma dosyalarını yönetir. GitOps ile bu yapılandırmalar Git üzerinden kolayca güncellenir ve yönetilir.
- Sürekli Dağıtım ve Otomatik Yapılandırma Güncelleme:
- Yapılandırmalarda yapılan bir değişiklik Git’e push edildiğinde, bu değişiklik Config Server aracılığıyla otomatik olarak ilgili mikroservislere iletilir. Sürekli dağıtım sürecinde yapılandırmaların sürekli güncellenmesi sağlanır.
- Geri Alma ve Sürüm Kontrolü:
- Yapılandırmalarda bir hata oluştuğunda, Git geçmişinden önceki bir sürüme geri dönmek kolaydır. Bu, uygulamanın güvenliğini artırır.
- Güvenlik ve Hassas Bilgilerin Yönetimi:
- Spring Cloud Config Server, hassas bilgileri (API anahtarları, şifreler vb.) güvenli bir şekilde yönetmek için spring-cloud-config-server ve spring-cloud-config-client entegrasyonunu kullanır. Bu bilgiler GitOps prensiplerine göre şifrelenerek Git üzerinde tutulabilir.
GitOps Prensipleri ile Spring Cloud Kullanmanın Avantajları
- Kolay ve Merkezi Yapılandırma Yönetimi:
- GitOps ile tüm yapılandırmalar merkezi bir Git deposunda tutulur ve değişiklikler tek bir yerden yönetilir.
- Versiyon Kontrolü ve İzlenebilirlik:
- Yapılandırmalar Git üzerinde versiyonlanır. Bu sayede, her değişiklik geçmişte izlenebilir ve gerekirse önceki bir sürüme geri dönülebilir.
- Otomatik Dağıtım ve Güncellemeler:
- Spring Cloud Config Server ve GitOps entegrasyonu, yapılandırma değişikliklerini otomatik olarak mikroservislere iletir. Bu sayede sürekli entegrasyon ve sürekli dağıtım süreçleri hızlanır.
- Artırılmış Güvenlik:
- Yapılandırma dosyaları Git üzerinde güvenli bir şekilde tutulur ve değişikliklerin kim tarafından yapıldığı izlenebilir. Bu, güvenlik açısından avantaj sağlar.
Sonuç
Spring Cloud ve GitOps prensipleri ile mikroservislerin yapılandırmalarını yönetmek, yapılandırma değişikliklerinin kolayca yönetilmesini, izlenmesini ve sürüm kontrolü yapılmasını sağlar. GitOps yaklaşımı, tüm yapılandırmaların merkezi bir Git deposunda tutulmasını ve değişikliklerin otomatik olarak dağıtılmasını sağlayarak güvenli, tekrarlanabilir ve izlenebilir bir yapı oluşturur. Spring Cloud Config Server ve GitOps entegrasyonu, mikroservislerin yapılandırma yönetimini kolaylaştırarak daha güvenilir bir dağıtım süreci sunar.
9.3 Kubernetes Üzerinde Sürekli Dağıtım
Sürekli Dağıtım (Continuous Deployment - CD), yazılım geliştirme sürecinde yapılan her değişikliğin otomatik olarak test edilip üretim ortamına dağıtılmasıdır. Kubernetes, mikroservis mimarisinde sürekli dağıtım için ideal bir ortam sağlar. Kubernetes ile uygulama dağıtımlarını otomatikleştirebilir, yüksek erişilebilirlik sağlayabilir ve dağıtım süreçlerini güvenilir hale getirebilirsiniz.
Kubernetes üzerinde sürekli dağıtım yapmak için CI/CD araçları ve Kubernetes otomasyon özellikleri birlikte kullanılır. Bu süreçte, GitOps gibi bir yaklaşımla Jenkins, Argo CD, GitLab CI/CD gibi araçlar entegrasyon sağlar.
Kubernetes Üzerinde Sürekli Dağıtım Sürecinin Temel Bileşenleri
- CI/CD Pipeline:
- Jenkins veya GitLab CI/CD gibi bir CI/CD aracı, kod değişikliklerini otomatik olarak test eder, paketler ve Kubernetes üzerinde dağıtımı gerçekleştirir.
- YAML Tanımları ve Manifest Dosyaları:
- Kubernetes’te dağıtım yapmak için Deployment, Service, ConfigMap gibi nesneleri tanımlayan YAML dosyaları kullanılır. Bu dosyalar Git deposunda versiyonlanır ve değişiklikleri takip edilir.
- GitOps Prensipleri:
- GitOps ile, tüm yapılandırmalar Git’te tutulur ve kod değişiklikleriyle dağıtım otomatikleştirilir. Yapılandırma değişiklikleri Git üzerinden yönetildiği için izlenebilirlik ve sürüm kontrolü sağlanır.
- CD Aracı (Örneğin, Argo CD):
- Argo CD gibi araçlar, Git deposunu izler ve bir değişiklik yapıldığında Kubernetes kümesindeki yapılandırmaları otomatik olarak günceller.
Kubernetes Üzerinde Sürekli Dağıtım Adımları
Aşağıda, Kubernetes üzerinde sürekli dağıtım için Jenkins CI/CD pipeline ve Argo CD gibi araçların nasıl kullanılabileceğine dair detaylı bir örnek bulunmaktadır.
Adım 1: Jenkins Pipeline Kurulumu
Jenkins, sürekli entegrasyon sürecinin bir parçası olarak kodu test eder, derler ve Docker image olarak paketler. Bu image Kubernetes kümesine otomatik olarak dağıtılır.
- Jenkins Pipeline Yapılandırması (Jenkinsfile)
- Jenkinsfile içinde pipeline adımları tanımlanır:
- pipeline {
- agent any
- environment {
- DOCKER_HUB_REPO = 'your-dockerhub-username/my-microservice'
- IMAGE_TAG = "v${env.BUILD_NUMBER}"
- KUBE_CONFIG_PATH = "/path/to/kubeconfig" // Kubernetes kümesine erişim için kubeconfig dosyası
- }
- stages {
- stage('Build') {
- steps {
- echo 'Building...'
- sh 'mvn clean package'
- }
- }
- stage('Test') {
- steps {
- echo 'Testing...'
- sh 'mvn test'
- }
- }
- stage('Build Docker Image') {
- steps {
- echo 'Building Docker image...'
- sh "docker build -t ${DOCKER_HUB_REPO}:${IMAGE_TAG} ."
- }
- }
- stage('Push Docker Image') {
- steps {
- echo 'Pushing Docker image to Docker Hub...'
- withCredentials([usernamePassword(credentialsId: 'docker-hub-credentials', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
- sh 'docker login -u $DOCKER_USER -p $DOCKER_PASS'
- sh "docker push ${DOCKER_HUB_REPO}:${IMAGE_TAG}"
- }
- }
- }
- stage('Deploy to Kubernetes') {
- steps {
- echo 'Deploying to Kubernetes...'
- withCredentials([file(credentialsId: 'kubeconfig', variable: 'KUBE_CONFIG')]) {
- sh 'kubectl --kubeconfig=$KUBE_CONFIG set image deployment/my-microservice my-microservice=${DOCKER_HUB_REPO}:${IMAGE_TAG}'
- }
- }
- }
- }
- }
- Bu pipeline:
- Maven ile uygulamayı derler ve test eder.
- Docker image oluşturur ve Docker Hub’a push eder.
- Kubernetes’te çalışan bir Deployment için image güncellemesi yapar.
Adım 2: Kubernetes YAML Dosyalarının Tanımlanması
Kubernetes üzerinde dağıtım için gerekli YAML dosyaları oluşturulur. Örneğin, bir Deployment ve Service nesnesi tanımlanır.
- Deployment.yaml:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: my-microservice
- labels:
- app: my-microservice
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: my-microservice
- template:
- metadata:
- labels:
- app: my-microservice
- spec:
- containers:
- - name: my-microservice
- image: your-dockerhub-username/my-microservice:latest
- ports:
- - containerPort: 8080
- Service.yaml:
- apiVersion: v1
- kind: Service
- metadata:
- name: my-microservice-service
- spec:
- selector:
- app: my-microservice
- ports:
- - protocol: TCP
- port: 80
- targetPort: 8080
- type: LoadBalancer
Bu dosyalar Kubernetes kümesinde pod’ların nasıl çalışacağını ve dış dünyaya nasıl açılacağını tanımlar.
Adım 3: GitOps ile Dağıtım Süreci
GitOps, tüm dağıtım ve yapılandırma değişikliklerinin Git üzerinde yapılmasını sağlar. Argo CD gibi GitOps araçları, belirli bir Git deposunu izleyerek değişiklikleri otomatik olarak Kubernetes kümesine dağıtır.
- Argo CD Kurulumu:
- Argo CD’yi Kubernetes kümesine kurmak için aşağıdaki komutu kullanabilirsiniz:
- kubectl create namespace argocd
- kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
- Argo CD ile Git Deposu Bağlantısı:
- Argo CD, Git deposunu izler ve bu depodaki YAML dosyalarını Kubernetes kümesine uygular. Git deposunda yapılan bir değişiklik Argo CD tarafından algılanır ve otomatik olarak dağıtım güncellenir.
- Argo CD’de yeni bir uygulama oluşturmak için:
- argocd app create my-microservice \
- --repo https://github.com/username/repo-name \
- --path /path/to/yaml/files \
- --dest-server https://kubernetes.default.svc \
- --dest-namespace default
- Bu komut Argo CD’ye:
- Git deposunu (repo) ve dosya yolunu (path) belirtir.
- Kubernetes kümesi (dest-server) ve namespace’ini (dest-namespace) tanımlar.
- Argo CD ile Otomatik Güncelleme:
- Argo CD, Git deposundaki YAML dosyalarında bir değişiklik olduğunda otomatik olarak Kubernetes kümesindeki kaynakları günceller. Bu sayede, sürekli dağıtım süreci güvenilir ve izlenebilir hale gelir.
Adım 4: Kubernetes ve GitOps ile Sürekli Dağıtımın İzlenmesi
Argo CD’nin web arayüzüne erişerek uygulama durumlarını ve dağıtım sürecini izleyebilirsiniz:
kubectl port-forward svc/argocd-server -n argocd 8080:443
Argo CD web arayüzüne https://localhost:8080 üzerinden ulaşabilirsiniz. Burada, uygulamalarınızın durumunu, mevcut ve önceki dağıtımları izleyebilir, hangi konfigürasyon değişikliklerinin yapıldığını görebilirsiniz.
Kubernetes Üzerinde Sürekli Dağıtım Kullanım Senaryoları
- Mikroservis Güncellemeleri:
- Kubernetes, her mikroservis için ayrı bir Deployment kullanarak sürekli dağıtımı sağlar. Git’te yapılan her değişiklik Kubernetes’e otomatik olarak yansıtılır.
- Çoklu Ortam Yönetimi:
- GitOps ve Argo CD kullanarak, farklı ortamlar (dev, test, prod) için yapılandırmalar oluşturulabilir. Her bir ortamın yapılandırması Git deposunda tutulur ve Kubernetes’e yansıtılır.
- Rollback (Geri Alma) Kolaylığı:
- GitOps sayesinde, yapılandırma hataları durumunda Git deposunda önceki bir sürüme geri dönmek kolaydır. Argo CD, eski yapılandırmayı otomatik olarak geri yükler.
- Yüksek Güvenlik ve İzlenebilirlik:
- GitOps, tüm değişiklikleri Git’te versiyonlar ve kaydeder. Bu, yapılandırma değişikliklerinin kim tarafından yapıldığını izlemenizi sağlar.
Kubernetes Üzerinde Sürekli Dağıtımın Avantajları
- **Otomatik ve Güvenilir
Dağıtım**:
- Git deposundaki her değişiklik, Kubernetes’e otomatik olarak yansıtılır ve dağıtım güvenilir hale gelir.
- Kolay Geri Alma ve Sürüm Kontrolü:
- Git geçmişi sayesinde herhangi bir yapılandırma değişikliği geri alınabilir.
- Yüksek Erişilebilirlik ve Öz-Düzeltme:
- Kubernetes, başarısız olan pod’ları otomatik olarak yeniden başlatarak uygulamanın sürekli erişilebilir olmasını sağlar.
- Kolay ve Tekrarlanabilir Dağıtım Süreçleri:
- GitOps ve CI/CD araçları ile sürekli dağıtım süreçleri tekrarlanabilir ve izlenebilir hale gelir.
Sonuç
Kubernetes üzerinde sürekli dağıtım, GitOps ve CI/CD araçlarıyla birleşerek uygulamaların hızlı, güvenilir ve izlenebilir bir şekilde dağıtılmasını sağlar. Jenkins veya Argo CD gibi araçlar, sürekli dağıtım sürecini otomatikleştirirken, Kubernetes platformu uygulamaların sürekli çalışmasını ve ölçeklenebilirliğini destekler. Bu yapı sayesinde mikroservis tabanlı uygulamalar güvenli ve sürdürülebilir bir şekilde yönetilebilir.
10.1 AWS Üzerine Spring Cloud Mikroservisleri Yerleştirme
Amazon Web Services (AWS), mikroservis tabanlı uygulamaların çalıştırılması için güçlü bir altyapı ve hizmetler sunar. Spring Cloud, mikroservislerin birbirleriyle kolayca iletişim kurmasını, yapılandırma yönetimini ve dağıtık izlemeyi sağlar. Spring Cloud ve AWS hizmetleri bir araya geldiğinde, mikroservislerin ölçeklenebilir, yüksek erişilebilir ve yönetilebilir bir şekilde çalışması sağlanır.
Bu rehberde, AWS üzerinde Spring Cloud mikroservislerinin nasıl yerleştirileceğini ve AWS’nin sağladığı hizmetleri nasıl kullanabileceğinizi adım adım anlatacağız.
AWS Üzerinde Spring Cloud Mikroservislerini Dağıtmak İçin Gerekli Bileşenler
- Elastic Kubernetes Service (EKS): Kubernetes tabanlı bir altyapı sağlar. Mikroservislerin konteynerler içinde yönetilmesi için kullanılır.
- Elastic Container Service (ECS): Konteynerlerin yönetilmesi için AWS tarafından sağlanan başka bir hizmettir.
- Elastic Load Balancer (ELB): Mikroservisler arasında yük dengeleme ve trafiği yönlendirme için kullanılır.
- AWS RDS (Relational Database Service): Mikroservislerin veritabanı gereksinimlerini karşılar.
- AWS S3: Dosya depolama çözümü sunar.
- AWS Secrets Manager: Hassas yapılandırma ve kimlik bilgilerini yönetmek için kullanılır.
Bu rehberde, AWS EKS ve RDS gibi hizmetleri kullanarak Spring Cloud mikroservislerini AWS üzerinde nasıl dağıtacağımıza odaklanacağız.
AWS Üzerine Spring Cloud Mikroservislerinin Adım Adım Yerleştirilmesi
Adım 1: AWS EKS Kümesini Oluşturma
- EKS Kümesi Oluşturun:
- AWS Management Console’a gidin ve bir EKS kümesi oluşturun. Bu işlem, Kubernetes tabanlı uygulamalarınızı çalıştırmak için AWS üzerinde bir küme (cluster) başlatır.
- Cluster Name: Küme adını belirtin.
- Region: Uygulamanızın hangi bölgede çalışacağını seçin.
- Node Group: Küme için gerekli EC2 düğüm gruplarını oluşturun. Bu düğümler, Kubernetes pod’larını çalıştıracak altyapıyı sağlar.
- kubectl ve AWS CLI ile Bağlantı Kurun:
- Yerel ortamınızda EKS kümesine bağlanmak için kubectl ve aws-cli araçlarını yükleyin ve yapılandırın. EKS kümesine bağlanmak için aşağıdaki komutu çalıştırın:
- aws eks --region <your-region> update-kubeconfig --name <your-cluster-name>
Adım 2: Docker Image’leri AWS ECR’ye Yükleme
Amazon Elastic Container Registry (ECR), Docker image’lerinizi depolamak için AWS tarafından sağlanan bir Docker container registry’dir.
- ECR’de Bir Repository Oluşturun:
- AWS Console üzerinden ECR’de her bir mikroservis için bir repository oluşturun.
- Docker Image’leri ECR’ye Push Etme:
- Spring Cloud mikroservisleri için oluşturulan Docker image’leri ECR’ye yüklemek için şu adımları izleyin:
- # Docker ECR Login
- aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <your-account-id>.dkr.ecr.<your-region>.amazonaws.com
- # Docker Image Oluşturma
- docker build -t my-microservice .
- # Docker Image'i Etiketleme
- docker tag my-microservice:latest <your-account-id>.dkr.ecr.<your-region>.amazonaws.com/my-microservice:latest
- # Docker Image'i ECR'ye Gönderme
- docker push <your-account-id>.dkr.ecr.<your-region>.amazonaws.com/my-microservice:latest
Adım 3: AWS RDS ile Veritabanı Kurulumu
Spring Cloud mikroservisleriniz için AWS RDS üzerinde bir veritabanı oluşturun.
- RDS Üzerinde Yeni Bir Veritabanı Başlatın:
- AWS Management Console’dan RDS bölümüne gidin ve yeni bir veritabanı oluşturun. MySQL, PostgreSQL veya ihtiyaçlarınıza uygun başka bir veritabanı motorunu seçebilirsiniz.
- Veritabanı Bağlantı Ayrıntılarını Kaydedin:
- RDS veritabanı için gerekli bağlantı bilgilerini kaydedin (hostname, port, username, password). Bu bilgileri Spring Cloud mikroservislerinde kullanacaksınız.
- Güvenlik Grupları:
- Mikroservislerin RDS veritabanına erişebilmesi için EKS ve RDS için aynı güvenlik grubunu tanımlayın veya gerekli izinleri ekleyin.
Adım 4: Spring Cloud Config Server’ı AWS Üzerinde Kurma
Spring Cloud mikroservislerinizin merkezi yapılandırmasını yönetmek için AWS üzerinde bir Spring Cloud Config Server dağıtabilirsiniz.
- Spring Cloud Config Server Docker Image’i ECR’ye Yükleyin:
- Spring Cloud Config Server’ınızı içeren Docker image’i AWS ECR’ye yükleyin.
- Config Server için YAML Dosyası:
- Config Server’ınızın application.yml dosyasında Git deposunu veya S3 gibi bir AWS kaynak deposunu belirtin. Örneğin, Git tabanlı bir yapılandırma kullanabilirsiniz:
- spring:
- cloud:
- config:
- server:
- git:
- uri: https://github.com/your-git-repo/config-repo
- clone-on-start: true
- Config Server’ı EKS Üzerinde Çalıştırma:
- Config Server için Kubernetes Deployment ve Service YAML dosyalarını oluşturun ve Kubernetes kümesine uygulayın:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: config-server
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: config-server
- template:
- metadata:
- labels:
- app: config-server
- spec:
- containers:
- - name: config-server
- image: <your-ecr-repo-url>/config-server:latest
- ports:
- - containerPort: 8888
Adım 5: Spring Cloud Mikroservislerini EKS Üzerine Dağıtma
AWS EKS üzerinde her mikroservisi ayrı bir Deployment ve Service ile dağıtabilirsiniz.
- Mikroservis için Deployment ve Service YAML Dosyası:
- Her bir mikroservis için aşağıdaki gibi bir Deployment dosyası oluşturun:
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: my-microservice
- spec:
- replicas: 3
- selector:
- matchLabels:
- app: my-microservice
- template:
- metadata:
- labels:
- app: my-microservice
- spec:
- containers:
- - name: my-microservice
- image: <your-ecr-repo-url>/my-microservice:latest
- ports:
- - containerPort: 8080
- env:
- - name: SPRING_PROFILES_ACTIVE
- value: aws
- - name: SPRING_DATASOURCE_URL
- value: jdbc:mysql://<rds-endpoint>:3306/mydatabase
- - name: SPRING_DATASOURCE_USERNAME
- valueFrom:
- secretKeyRef:
- name: my-secret
- key: username
- - name: SPRING_DATASOURCE_PASSWORD
- valueFrom:
- secretKeyRef:
- name: my-secret
- key: password
- Bu dosyada:
- replicas: Mikroservisin kaç örneğinin çalışacağını belirtir.
- image: AWS ECR’de depolanan Docker image’i belirtir.
- env: AWS RDS bağlantı bilgilerini ve gerekli yapılandırmaları içerir.
- Service Tanımlaması:
- Mikroservise erişim sağlamak için aşağıdaki gibi bir Service tanımlaması yapabilirsiniz:
- apiVersion: v1
- kind: Service
- metadata:
- name: my-microservice-service
- spec:
- type: LoadBalancer
- selector:
- app: my-microservice
- ports:
- - protocol: TCP
- port: 80
- targetPort: 8080
Adım 6: AWS Secrets Manager ile Hassas Bilgileri Yönetme
Hassas verileri (API anahtarları, veritabanı şifreleri gibi) AWS Secrets Manager’da saklayabilirsiniz ve bu verileri Kubernetes ortamında güvenli bir şekilde kullanabilirsiniz.
- Secret Tanımlaması:
- AWS Secrets Manager’da bir gizli anahtar (secret) oluşturun ve veritabanı kullanıcı adı ve parolasını saklayın.
- Kubernetes Secret Tanımlaması:
- Secrets Manager’daki verileri Kubernetes Secret olarak
kullanmak için aşağıdaki gibi bir tanımlama yapabilirsiniz:
apiVersion: v1
kind: Secret
metadata:
name: my-secret
data:
username: <base64-encoded-username>
password: <base64-encoded-password>
Adım 7: İzleme ve Güncellemeler
AWS üzerinde çalışan mikroservislerin izlenmesi ve yönetilmesi için aşağıdaki AWS hizmetlerini kullanabilirsiniz:
- Amazon CloudWatch: Mikroservislerin metriklerini ve loglarını toplayarak izleme sağlar.
- AWS X-Ray: Dağıtık izleme ve performans analizi için kullanılır. Mikroservisler arasında yapılan çağrıların izlenmesini sağlar.
AWS Üzerinde Spring Cloud Mikroservislerini Kullanmanın Avantajları
- Kolay Ölçeklenebilirlik:
- AWS, EKS ve ELB ile yüksek erişilebilirlik sağlar ve mikroservislerin trafiğe göre otomatik olarak ölçeklenmesini destekler.
- Yüksek Güvenlik:
- AWS Identity and Access Management (IAM) ve Secrets Manager gibi güvenlik hizmetleri ile mikroservislerin güvenliği sağlanır.
- Otomatik Yük Dengeleme:
- AWS Load Balancer hizmeti, mikroservisler arasında otomatik yük dengeleme yapar ve yüksek performans sağlar.
- Gelişmiş İzleme ve Loglama:
- CloudWatch ve X-Ray gibi AWS hizmetleri ile mikroservislerin performansı ve güvenliği izlenebilir.
Sonuç
AWS üzerinde Spring Cloud mikroservislerini yerleştirmek, uygulamanın ölçeklenebilir ve yüksek erişilebilir bir altyapı üzerinde çalışmasını sağlar. EKS, RDS, ECR, Load Balancer gibi AWS hizmetleri ile Spring Cloud mikroservislerinin yönetimi, güvenliği ve performans takibi sağlanır. Bu yapı, modern mikroservis mimarisinin bulut üzerinde güvenilir bir şekilde çalışmasını sağlar.
10.2 AWS Üzerinde Yönetilen Servislerin Kullanımı
AWS, mikroservis mimarilerini çalıştırmak ve yönetmek için birçok yönetilen hizmet sunar. Bu hizmetler, altyapının yönetim yükünü AWS’ye devrederek geliştiricilere odaklanmaları gereken uygulama koduna daha fazla zaman ayırma fırsatı verir. AWS’nin sunduğu yönetilen hizmetler, mikroservislerin ölçeklenebilir, güvenli ve güvenilir bir şekilde çalışmasını sağlar.
Bu rehberde, AWS üzerinde Spring Cloud mikroservislerinin çalıştırılması için kullanabileceğiniz temel yönetilen hizmetleri ele alacağız. Yönetilen hizmetler, altyapı yönetimiyle uğraşmadan uygulamaların hızlıca dağıtılmasına ve ölçeklenmesine yardımcı olur.
AWS Üzerinde Sıkça Kullanılan Yönetilen Hizmetler
- AWS Fargate: Konteynerlerin sunucu yönetimi olmadan çalıştırılmasını sağlar.
- Amazon RDS: Yönetilen veritabanı hizmetidir; veritabanı yönetimini AWS üstlenir.
- Amazon API Gateway: Mikroservisler için API yönetim hizmeti sunar.
- AWS Lambda: Sunucusuz (serverless) işlevleri çalıştırmak için kullanılır.
- Amazon DynamoDB: Yönetilen NoSQL veritabanıdır; yüksek performanslı ve ölçeklenebilir bir veritabanı sağlar.
- Amazon S3: Dosya depolama hizmeti sunar.
- Amazon CloudWatch: İzleme ve loglama hizmetidir.
- AWS Secrets Manager: Hassas yapılandırma ve kimlik bilgilerini güvenli bir şekilde saklar.
AWS Yönetilen Hizmetlerini Kullanarak Spring Cloud Mikroservislerinin Dağıtımı
Aşağıda AWS yönetilen hizmetleri ile Spring Cloud mikroservislerini dağıtmak için bir rehber bulabilirsiniz.
1. AWS Fargate ile Konteynerlerin Yönetimi
AWS Fargate, ECS veya EKS ile birlikte kullanılarak konteynerlerin altyapı yönetimi olmadan çalıştırılmasını sağlar. Fargate, her mikroservis için gerekli CPU ve bellek kaynaklarını otomatik olarak yönetir.
- Fargate ile ECS (Elastic Container Service) kullanarak her mikroservis için bir hizmet (service) oluşturabilirsiniz.
- Auto Scaling: Fargate, mikroservisler için trafiğe göre otomatik ölçeklenebilirliği destekler.
- ECR Entegrasyonu: AWS Fargate, Amazon ECR’de depolanan Docker image’lerini doğrudan kullanabilir.
Örneğin, Spring Cloud mikroservislerinizi Fargate üzerinde çalıştırmak için önce Amazon ECR’de Docker image’lerinizi saklayabilir, ardından Fargate ile ECS’de bu image’leri çalıştırabilirsiniz.
2. Amazon RDS ile Yönetilen Veritabanı
Amazon RDS (Relational Database Service), ilişkisel veritabanı yönetimini AWS’ye devreder. Amazon RDS, yüksek erişilebilirlik, otomatik yedekleme, ölçeklenebilirlik gibi avantajlar sunar ve veritabanı yönetimiyle ilgili iş yükünü ortadan kaldırır.
- MySQL, PostgreSQL, Oracle, SQL Server gibi desteklenen veritabanları: Spring Cloud mikroservisleriniz için RDS üzerinde ihtiyaçlarınıza uygun bir veritabanı oluşturabilirsiniz.
- Multi-AZ (Çoklu Bölge) Dağıtımı: Amazon RDS, çoklu bölge desteği ile veri dayanıklılığını ve erişilebilirliği artırır.
- Otomatik Yedekleme ve Anlık Görüntü (Snapshot) Alma: Veritabanı yedekleri otomatik olarak alınır, bu da veri kurtarma sürecini kolaylaştırır.
Spring Cloud mikroservisleri, RDS veritabanına doğrudan bağlanabilir ve veritabanı bağlantı bilgilerini AWS Secrets Manager veya Config Server gibi bir yapılandırma yönetimi çözümüyle güvenli bir şekilde yönetebilir.
3. Amazon API Gateway ile API Yönetimi
Amazon API Gateway, mikroservisleriniz için güvenli, ölçeklenebilir ve yönetilebilir bir API katmanı sağlar. Mikroservislerinize gelen API çağrılarını AWS API Gateway üzerinden yönlendirerek erişim kontrolü, güvenlik ve izleme gibi işlemleri yönetebilirsiniz.
- HTTP ve WebSocket Desteği: API Gateway, RESTful API’lerin yanı sıra WebSocket desteği de sunar.
- Yetkilendirme ve Erişim Kontrolü: API çağrılarını AWS IAM, Lambda veya OAuth 2.0 ile güvence altına alabilirsiniz.
- Otomatik Ölçeklenebilirlik: API Gateway, gelen trafiğe göre ölçeklenebilir.
- Entegrasyon: API Gateway, Lambda, ECS, Fargate, ve diğer AWS hizmetleri ile entegre çalışabilir.
API Gateway’i, Spring Cloud mikroservisleriniz için bir giriş noktası (API Gateway) olarak kullanarak gelen trafiği yönetebilirsiniz. Ayrıca, istek yönlendirme, oran sınırlaması ve güvenlik gibi özellikleri kullanarak API yönetimini kolaylaştırabilirsiniz.
4. AWS Lambda ile Sunucusuz Mikroservisler
AWS Lambda, sunucu yönetimi gerektirmeden kod çalıştırmayı sağlar. Lambda, küçük ve bağımsız işlevlerin (fonksiyonların) hızlı bir şekilde çalışmasını sağlar.
- Sunucusuz Mikroservis: Lambda’yı, düşük yoğunluklu veya belirli olaylara dayalı olarak çalışan mikroservisler için kullanabilirsiniz.
- Süreye Dayalı Ücretlendirme: Lambda, yalnızca kod çalışırken ücretlendirildiğinden maliyetleri optimize eder.
- Diğer AWS Hizmetleriyle Entegrasyon: Lambda, API Gateway, S3, DynamoDB gibi AWS hizmetleriyle doğrudan entegre olur.
AWS Lambda’yı Spring Cloud mikroservislerinizin bir parçası olarak belirli işlevleri gerçekleştirmek için kullanabilirsiniz. Örneğin, belirli bir olay tetiklendiğinde (yeni bir dosya S3’e yüklendiğinde) Lambda işlevi çalıştırılabilir.
5. Amazon DynamoDB ile NoSQL Veri Yönetimi
Amazon DynamoDB, AWS tarafından yönetilen yüksek performanslı ve ölçeklenebilir bir NoSQL veritabanıdır. DynamoDB, yüksek veri hacmi ve yüksek hızlı veri erişimi gerektiren uygulamalar için idealdir.
- Otomatik Ölçeklenebilirlik: DynamoDB, gelen istek trafiğine göre otomatik olarak ölçeklenebilir.
- Düşük Gecikmeli Veri Erişimi: Mikroservisler için hızlı veri erişimi sağlar.
- Sunucusuz (Serverless) Model: DynamoDB tamamen yönetilen bir hizmettir, sunucu yönetimi gerektirmez.
Spring Cloud mikroservislerinizin NoSQL veri ihtiyacı varsa, DynamoDB ile yapılandırabilirsiniz. Özellikle yüksek veri erişim hızları gerektiren uygulamalarda DynamoDB ideal bir çözümdür.
6. Amazon S3 ile Dosya Depolama
Amazon S3 (Simple Storage Service), ölçeklenebilir ve dayanıklı bir nesne depolama çözümü sunar. S3, mikroservislerinizde büyük dosyaların veya statik içeriklerin saklanması için kullanılabilir.
- Statik Dosya Depolama: Mikroservislerin ürettiği raporlar, medya dosyaları veya yedeklemeler için ideal bir depolama alanı sağlar.
- Dayanıklılık ve Güvenlik: S3, yüksek dayanıklılık ve güvenlik sunar.
- Kolay Erişim ve Yönetim: S3’te depolanan dosyalar doğrudan AWS SDK veya API üzerinden erişilebilir.
S3, Spring Cloud mikroservislerinizde kullanıcı tarafından yüklenen dosyaların saklanması veya statik içeriklerin dağıtımı için kullanılabilir.
7. Amazon CloudWatch ile İzleme ve Loglama
Amazon CloudWatch, AWS üzerinde çalışan uygulamalar için izleme, loglama ve alarm yönetimi hizmetidir. Mikroservislerin durumunu ve performansını takip edebilir ve uyarılar tanımlayabilirsiniz.
- Metrik Toplama ve İzleme: CloudWatch, mikroservislerin CPU, bellek, disk kullanımı gibi metriklerini toplar.
- Log Yönetimi: CloudWatch Logs ile mikroservislerin log verilerini merkezi bir yerde toplayarak analiz edebilirsiniz.
- Alarmlar: CloudWatch alarmları ile belirli bir metrik eşiği aşıldığında uyarılar oluşturabilirsiniz.
Spring Cloud mikroservislerinizin loglarını CloudWatch’a yönlendirebilir ve sistem performansını izleyebilirsiniz. Bu, uygulama sağlığını ve performansını sürekli olarak gözlemlemenize olanak tanır.
8. AWS Secrets Manager ile Hassas Bilgi Yönetimi
AWS Secrets Manager, uygulamalarınızın ihtiyaç duyduğu hassas verileri güvenli bir şekilde saklamanızı sağlar. Secrets Manager, veritabanı kimlik bilgileri, API anahtarları ve diğer hassas bilgileri yönetir.
- **Gü
venli Saklama**: Hassas veriler güvenli bir şekilde saklanır ve erişim AWS IAM ile kontrol edilir.
- Rotasyon: Secrets Manager, hassas bilgilerin otomatik olarak döndürülmesini sağlar.
- Entegrasyon: Spring Cloud mikroservislerinizin ihtiyaç duyduğu hassas bilgileri Secrets Manager’dan alabilirsiniz.
Spring Cloud mikroservislerinizdeki veritabanı şifreleri veya API anahtarları gibi hassas bilgileri AWS Secrets Manager’da güvenli bir şekilde saklayabilir ve uygulamanızda kullanabilirsiniz.
AWS Yönetilen Hizmetlerinin Avantajları
- Kolay Yönetim: Yönetilen hizmetler sayesinde altyapı yönetimi AWS tarafından sağlanır. Bu, geliştiricilerin kod geliştirmeye daha fazla odaklanmasını sağlar.
- Otomatik Ölçeklenebilirlik: AWS, mikroservislerin ihtiyaca göre otomatik olarak ölçeklenmesini sağlar.
- Güvenlik ve Uyumluluk: AWS, hassas bilgilerin güvenliğini sağlamak için birçok güvenlik hizmeti ve uyumluluk sertifikası sunar.
- Maliyet Etkinliği: Yönetilen hizmetler genellikle yalnızca kullanılan kaynaklar için ücretlendirilir. Bu, maliyetlerin optimize edilmesine yardımcı olur.
- Entegrasyon ve Esneklik: AWS yönetilen hizmetleri, birçok AWS hizmeti ve dış sistemle kolayca entegre edilebilir.
Sonuç
AWS üzerindeki yönetilen hizmetler, Spring Cloud mikroservislerini çalıştırmak için güçlü bir altyapı sağlar. AWS Fargate, RDS, API Gateway, Lambda, DynamoDB, S3, CloudWatch ve Secrets Manager gibi hizmetlerle altyapı yönetimi AWS’ye devredilirken, mikroservisler güvenilir, ölçeklenebilir ve güvenli bir şekilde çalışır. Yönetilen hizmetler, altyapı ve veri güvenliği yönetimini kolaylaştırarak, mikroservislerin hızlı bir şekilde geliştirilmesi ve dağıtılmasına olanak tanır.
10.3 AWS Lambda ve Serverless Entegrasyonu
AWS Lambda, sunucu yönetimi olmadan kod çalıştırmayı sağlayan bir sunucusuz (serverless) hizmettir. Serverless mimari ile uygulama geliştirirken altyapıyı yönetme ihtiyacınız ortadan kalkar, bu sayede yalnızca işlevlere odaklanabilirsiniz. AWS Lambda, belirli olaylar tetiklendiğinde otomatik olarak işlevleri çalıştırır ve yalnızca çalıştırma süresi kadar ücretlendirme yapılır. Spring Cloud gibi bir mikroservis mimarisinde Lambda ile serverless bileşenleri entegre ederek maliyet verimliliği, kolay ölçeklenebilirlik ve düşük bakım maliyeti sağlayabilirsiniz.
Bu rehberde, AWS Lambda ile serverless bir mimarinin nasıl kurulacağını ve Spring Cloud mikroservisleriyle nasıl entegre edileceğini inceleyeceğiz.
AWS Lambda ve Serverless Mimari Nedir?
- AWS Lambda: Altyapı yönetimi gerektirmeyen bir ortamda işlevleri çalıştırmayı sağlar. Lambda, belirli bir olay tetiklendiğinde kodu çalıştırır ve işlem tamamlandığında durur.
- Serverless Mimari: Altyapıyı yönetmek zorunda kalmadan yalnızca işlevlere odaklanarak hızlı ve verimli bir şekilde uygulama geliştirme yaklaşımıdır. Serverless mimaride, uygulamalar olay tabanlı olarak çalışır ve yalnızca ihtiyaç duyulan süre boyunca çalışarak maliyet tasarrufu sağlar.
AWS Lambda ile serverless mimarinin sunduğu avantajlar:
- Olay Tabanlı Çalışma: Lambda işlevleri (fonksiyonlar), belirli bir olay meydana geldiğinde (örneğin, API çağrısı, veritabanı değişikliği veya dosya yükleme) otomatik olarak tetiklenir.
- Otomatik Ölçeklenebilirlik: Lambda, gelen istek sayısına göre otomatik olarak ölçeklenir.
- Kullanım Tabanlı Ücretlendirme: Lambda, yalnızca kod çalıştığı sürece ücretlendirme yapar.
- Kolay Entegrasyon: Lambda, diğer AWS hizmetleriyle kolayca entegre edilebilir (API Gateway, S3, DynamoDB, RDS, vb.).
AWS Lambda ile Serverless Mimari Kurulumu
AWS Lambda ile serverless bir mimariyi kurmak için aşağıdaki adımları izleyebilirsiniz.
Adım 1: AWS Lambda İşlevi Oluşturma
AWS Management Console üzerinden AWS Lambda işlevi (fonksiyonu) oluşturabilirsiniz.
- Lambda Yönetim Konsoluna Gidin:
- AWS Management Console’da Lambda hizmetine gidin ve yeni bir işlev oluşturun.
- Yeni Bir İşlev Oluşturun:
- Function name: İşleviniz için bir ad belirtin.
- Runtime: Lambda işlevinizin yazılacağı dili seçin (Java, Node.js, Python, vb.). Örneğin, Spring Boot tabanlı bir işlev için Java seçebilirsiniz.
- Permissions (İzinler): Lambda işlevinin diğer AWS hizmetlerine erişebilmesi için gerekli IAM izinlerini verin.
- Lambda İşlev Kodu:
- Lambda işlevinin kodunu doğrudan AWS Lambda konsolunda veya bir CI/CD pipeline ile otomatik olarak yükleyebilirsiniz. Java ile yazılan bir Lambda işlevi aşağıdaki gibi görünebilir:
- import com.amazonaws.services.lambda.runtime.Context;
- import com.amazonaws.services.lambda.runtime.RequestHandler;
- public class HelloWorldLambda implements RequestHandler<Object, String> {
- @Override
- public String handleRequest(Object input, Context context) {
- return "Hello, AWS Lambda!";
- }
- }
- Lambda İşlevini Test Etme:
- Lambda işlevinizi AWS Lambda konsolunda test edebilir ve çıktılarını gözlemleyebilirsiniz.
Adım 2: Lambda İşlevini API Gateway ile Entegre Etme
API Gateway, Lambda işlevlerine HTTP üzerinden erişim sağlamanızı sağlar. Lambda işlevinizi API Gateway ile entegre ederek HTTP API çağrılarını işleyebilirsiniz.
- API Gateway Konsoluna Gidin:
- AWS Management Console’da API Gateway hizmetine gidin ve yeni bir REST API oluşturun.
- Yeni Bir API Oluşturun:
- API Name: API için bir ad verin.
- Endpoint Type: Public veya Private seçebilirsiniz.
- Yeni Bir Kaynak (Resource) ve Yöntem (Method) Ekleyin:
- Yeni bir kaynak oluşturun (örneğin, /hello).
- Bu kaynak için yeni bir yöntem ekleyin (örneğin, GET).
- Yöntem ayarlarında Lambda Function seçeneğini belirleyin ve Lambda işlevinizin adını girin.
- Lambda-API Gateway İzinlerini Yapılandırın:
- API Gateway’in Lambda işlevini çağırabilmesi için gerekli izinleri ayarlayın. AWS bu izinleri otomatik olarak yapılandırır.
- API’yi Dağıtın:
- API’yi dağıtarak API Gateway üzerinden Lambda işlevinize erişebilirsiniz. Dağıtım sonrası size bir Endpoint URL verilecektir; bu URL üzerinden Lambda işlevinizi çağırabilirsiniz.
Adım 3: Spring Cloud ile AWS Lambda Entegrasyonu
Spring Cloud ve AWS Lambda entegrasyonu, serverless işlevlerin Spring Cloud mikroservisleri tarafından çağrılmasını sağlar. Örneğin, bir Spring Boot uygulaması Lambda işlevlerini çağırabilir.
- Spring Boot Projesine AWS SDK Bağımlılıklarını Ekleyin:
- pom.xml dosyasına AWS SDK bağımlılıklarını ekleyin:
- <dependency>
- <groupId>com.amazonaws</groupId>
- <artifactId>aws-java-sdk-lambda</artifactId>
- <version>1.12.31</version>
- </dependency>
- AWS Lambda İşlevini Çağıran Bir Servis Yazın:
- Spring Boot uygulamanızda AWS Lambda işlevini çağırmak için bir servis yazın:
- import com.amazonaws.services.lambda.AWSLambda;
- import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
- import com.amazonaws.services.lambda.model.InvokeRequest;
- import com.amazonaws.services.lambda.model.InvokeResult;
- import java.nio.charset.StandardCharsets;
- public class LambdaService {
- private final AWSLambda awsLambda = AWSLambdaClientBuilder.defaultClient();
- public String callLambdaFunction(String functionName, String payload) {
- InvokeRequest invokeRequest = new InvokeRequest()
- .withFunctionName(functionName)
- .withPayload(payload);
- InvokeResult result = awsLambda.invoke(invokeRequest);
- return new String(result.getPayload().array(), StandardCharsets.UTF_8);
- }
- }
- Lambda İşlevini Çağıran Bir REST API Ekleyin:
- Spring Boot’ta bir REST API ekleyerek AWS Lambda işlevini çağırabilirsiniz:
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- @RestController
- @RequestMapping("/lambda")
- public class LambdaController {
- private final LambdaService lambdaService;
- public LambdaController(LambdaService lambdaService) {
- this.lambdaService = lambdaService;
- }
- @GetMapping("/invoke")
- public String invokeLambda() {
- String functionName = "HelloWorldLambda";
- String payload = "{}";
- return lambdaService.callLambdaFunction(functionName, payload);
- }
- }
Bu örnekte, /lambda/invoke endpoint’i çağrıldığında Lambda işlevi tetiklenecektir.
Adım 4: Serverless Framework Kullanarak Lambda Dağıtımı
Serverless Framework, AWS Lambda işlevlerinin daha hızlı ve verimli bir şekilde yönetilmesini sağlayan açık kaynak bir araçtır.
- Serverless Framework’ü Yükleyin:
- npm install -g serverless
- Serverless Projesi Oluşturun:
- serverless create --template aws-java-maven --path my-lambda-project
- cd my-lambda-project
- Serverless serverless.yml Dosyasını Yapılandırın:
- serverless.yml dosyasında Lambda işlevinizi ve kaynaklarını tanımlayın:
- service: my-lambda-service
- provider:
- name: aws
- runtime: java11
- region: us-east-1
- memorySize: 512
- timeout: 10
- functions:
- helloWorld:
- handler: com.example.HelloWorldLambda
- events:
- - http:
- path: hello
- method: get
- Serverless Framework ile Lambda İşlevini Dağıtın:
- serverless deploy
Bu komut, Lambda işlevinizi AWS’ye dağıtır ve API Gateway üzerinden erişilebilir hale getirir.
AWS Lambda ve Serverless Mimarinin Avantajları
- Kullanım Tabanlı Maliyet:
- AWS Lambda, yalnızca işlev çalıştığında ücretlendirildiğinden maliyet verimlidir
.
- Otomatik Ölçeklenebilirlik:
- Lambda, gelen taleplere göre otomatik olarak ölçeklenir ve yönetilir.
- Kolay Entegrasyon:
- Lambda, AWS’deki birçok hizmetle (API Gateway, DynamoDB, S3 vb.) entegre edilebilir.
- Yönetim Kolaylığı:
- Altyapıyı yönetme ihtiyacı ortadan kalkar, bu da daha hızlı geliştirme ve dağıtım sağlar.
Sonuç
AWS Lambda ve serverless mimari, Spring Cloud mikroservislerine esneklik, maliyet etkinliği ve kolay yönetim avantajları sağlar. Lambda, belirli olaylara yanıt olarak otomatik olarak çalışabilen işlevler sunarak altyapı yönetimi ve ölçeklendirme yükünü ortadan kaldırır. Serverless Framework ile Lambda işlevlerinizi hızlıca yönetebilir ve dağıtabilirsiniz. Bu entegrasyon, mikroservislerinizi daha verimli ve esnek bir hale getirir, böylece daha hızlı ve sürdürülebilir bir uygulama mimarisi oluşturabilirsiniz.
Ek A: Spring Cloud için En İyi Uygulamalar
Spring Cloud, mikroservis mimarisini yönetmeyi ve uygulamaların dağıtık sistemlerde çalışmasını kolaylaştırır. Ancak, karmaşık ve büyük ölçekli mikroservis sistemlerinde Spring Cloud bileşenlerini doğru bir şekilde kullanmak ve belirli en iyi uygulamaları takip etmek çok önemlidir. Bu ek bölümde, Spring Cloud uygulamalarınızı daha güvenli, ölçeklenebilir, performanslı ve sürdürülebilir hale getirecek en iyi uygulamaları ele alacağız.
1. Merkezi Yapılandırma Yönetimi
Mikroservis mimarisinde merkezi yapılandırma yönetimi, özellikle farklı ortamlar (geliştirme, test, üretim) için yapılandırma dosyalarının tutarlı ve güvenilir bir şekilde yönetilmesini sağlar.
- Spring Cloud Config Server Kullanımı: Tüm yapılandırmaları merkezi bir Spring Cloud Config Server üzerinde saklayın. Her mikroservis, Config Server üzerinden yapılandırma dosyalarını dinamik olarak alabilir.
- Güvenli Yapılandırma Yönetimi: API anahtarları, veritabanı şifreleri gibi hassas bilgileri saklamak için AWS Secrets Manager, HashiCorp Vault veya benzeri güvenli yönetim çözümleriyle entegre edin.
- Profil Tabanlı Yapılandırma: Farklı ortamlar için (örneğin, dev, prod) ayrı yapılandırma profilleri kullanarak kodun farklı ortamlara uyarlanmasını sağlayın.
2. Dayanıklılık (Resilience) ve Hata Yönetimi
Mikroservislerde bazı servislerin geçici olarak hizmet verememesi kaçınılmazdır. Bu durumlarda, dayanıklılık ve hata yönetimi mekanizmaları devreye girmelidir.
- Circuit Breaker Deseni: Spring Cloud Circuit Breaker ile devre kesici desenini uygulayın. Böylece, başarısız olan servis çağrılarını geçici olarak durdurarak sistemin aşırı yük altında kalmasını engelleyebilirsiniz.
- Retry (Tekrar Deneme): Bir servis çağrısı başarısız olduğunda, Spring Retry kütüphanesi ile belirli bir sayıda tekrar deneme mekanizması kurabilirsiniz.
- Fallback Mekanizmaları: Servis arızalarında, kritik olmayan işlevlerde kullanıcıya alternatif bir yanıt dönmek veya geçici bir yanıt sunmak için fallback mekanizmaları kullanın.
3. API Gateway ile Trafik Yönetimi
Spring Cloud Gateway, mikroservisler arasındaki trafiği yönetmek, güvenliğini sağlamak ve performansını artırmak için önemli bir bileşendir.
- Yük Dengeleme ve Yönlendirme: Mikroservisler arasındaki trafiği Spring Cloud Gateway veya Eureka kullanarak otomatik olarak dengeleyin ve yönlendirin.
- API Güvenliği: JWT (JSON Web Token) veya OAuth2 tabanlı kimlik doğrulama ve yetkilendirme mekanizmaları uygulayın.
- Oran Sınırlaması (Rate Limiting): Belirli API’lerin aşırı yük altında kalmasını engellemek için oran sınırlaması kuralları belirleyin. Bu, API Gateway aracılığıyla yapılabilir.
- Önbellekleme: Trafik yükünü azaltmak ve yanıt süresini iyileştirmek için API Gateway seviyesinde önbellekleme uygulayın.
4. Servis Keşfi ve Kayıt
Mikroservislerin birbirini dinamik olarak keşfedebilmesi, ölçeklenebilir ve esnek bir yapı oluşturur.
- Eureka Server Kullanımı: Servis keşfi için Spring Cloud Netflix Eureka kullanarak her mikroservisin kendini kayıt etmesini sağlayın. Bu, servislerin statik IP adreslerine bağımlı olmadan birbirlerini dinamik olarak keşfetmelerine olanak tanır.
- Kayıt Temizleme: Eureka Server üzerindeki eski kayıtların temizlenmesi için yapılandırmaları düzenli olarak kontrol edin.
- Çoklu Instance Yönetimi: Servislerin birden fazla örneği çalıştığında, Eureka Server yük dengeleme ile trafik yönetimini sağlar. Bu yapıyı ölçeklenebilir hale getirin.
5. Merkezi Loglama ve İzleme
Mikroservis mimarisinde dağıtık bir yapı olduğundan, merkezi loglama ve izleme oldukça önemlidir.
- ELK Stack (Elasticsearch, Logstash, Kibana): Tüm mikroservislerin loglarını merkezi bir yerde toplayın ve analiz etmek için ELK Stack gibi bir log yönetimi aracı kullanın.
- Zipkin ve Sleuth ile Dağıtık İzleme: Spring Cloud Sleuth ile servis çağrılarını izleyin ve Zipkin ile dağıtık izleme sağlayın. Bu, mikroservisler arasındaki çağrıların takibini kolaylaştırır.
- Prometheus ve Grafana ile İzleme: Prometheus ile mikroservislerin performans metriklerini toplayın ve Grafana ile görselleştirin.
6. Otomatik Ölçeklenebilirlik
Mikroservislerin gelen trafiğe göre otomatik olarak ölçeklenmesi, kaynakların verimli kullanılması ve sistem performansının korunması açısından kritiktir.
- Horizontal Scaling (Yatay Ölçekleme): Kubernetes veya Docker Swarm gibi orkestrasyon araçları ile mikroservislerin yatay ölçeklenmesini sağlayın.
- Health Check ve Self-Healing: Mikroservislerin sağlığını düzenli olarak kontrol edin ve başarısız olan servisleri otomatik olarak yeniden başlatan self-healing mekanizmaları kurun.
- Load Balancer Entegrasyonu: Mikroservislerin yüksek erişilebilirliğini sağlamak için yük dengeleyiciler (ELB, NGINX) kullanarak otomatik ölçeklenebilir bir yapı oluşturun.
7. Güvenlik En İyi Uygulamaları
Mikroservis mimarilerinde güvenlik, yapılandırma ve veri güvenliği gibi birçok açıdan ele alınmalıdır.
- API Güvenliği: OAuth2 ve JWT ile her bir mikroservisin güvenliğini sağlayın. API Gateway seviyesinde kimlik doğrulama yaparak her isteği kontrol altına alın.
- TLS Şifreleme: Mikroservisler arasında veri transferi sırasında TLS (Transport Layer Security) kullanarak şifreleme sağlayın.
- Hassas Bilgilerin Güvenliği: API anahtarları ve veritabanı şifreleri gibi hassas verileri AWS Secrets Manager veya Vault gibi güvenli bir ortamda saklayın.
- Rol ve Yetki Yönetimi: Mikroservisler arasında her isteği yetki kontrolüne tabi tutun. Kullanıcıların ve servislerin rol tabanlı erişim yönetimini sağlayın.
8. Geliştirici Verimliliğini Artıran En İyi Uygulamalar
Mikroservis mimarilerinde geliştirici verimliliği, sürdürülebilir bir sistem geliştirmek için oldukça önemlidir.
- CI/CD Pipeline Kurulumu: Jenkins, GitLab CI/CD veya CircleCI gibi araçlar kullanarak sürekli entegrasyon ve sürekli dağıtım süreçlerini otomatikleştirin.
- Infrastructure as Code (IaC): Terraform, CloudFormation veya Ansible gibi araçlarla altyapıyı kodla tanımlayın. Bu, ortamların yeniden yaratılmasını ve yönetilmesini kolaylaştırır.
- Versiyon Kontrolü ve GitOps: Tüm yapılandırma dosyalarını Git üzerinde tutarak GitOps yaklaşımını benimseyin. Bu, yapılandırma değişikliklerinin izlenebilirliğini artırır.
9. Uygulama Performansını Artıran En İyi Uygulamalar
Mikroservislerin performansını artırmak, kullanıcı deneyimini iyileştirir ve kaynak tüketimini optimize eder.
- Önbellekleme: Redis veya Memcached gibi dağıtık önbellekleme sistemleri kullanarak sık kullanılan verilerin yanıt sürelerini iyileştirin.
- Veri Erişimi Optimizasyonu: Mikroservislerin veritabanına olan sorgularını optimize edin. Karmaşık sorgularda veritabanı endeksleri kullanarak yanıt süresini kısaltın.
- Event-Driven Architecture: Mikroservisler arasında yoğun veri transferi olduğunda mesajlaşma sistemleri (Kafka, RabbitMQ) kullanarak olay odaklı bir mimari oluşturun.
10. Dağıtık Yapılandırmalarda Uyum ve Standartları Sağlama
Mikroservislerin farklı ortamlarda çalışabilmesi için uyum ve standartlar büyük önem taşır.
- Yapılandırma Dosyalarında Tutarlılık: Ortak konfigürasyonların aynı isimde ve aynı formatta tutulmasını sağlayın.
- Kullanılan Teknolojilerde Standartlaşma: Örneğin, tüm mikroservislerde aynı loglama formatını ve aynı loglama kütüphanesini (Logback, Log4j) kullanın.
- Kod İncelemeleri ve Test: Her değişiklik ön
cesinde kod incelemesi yaparak ve CI/CD süreçlerine otomatik testler ekleyerek kaliteyi sağlayın.
Sonuç
Bu en iyi uygulamalar, Spring Cloud tabanlı mikroservislerin daha güvenli, performanslı ve sürdürülebilir bir şekilde çalışmasını sağlar. Merkezi yapılandırma yönetiminden güvenlik uygulamalarına, API Gateway kullanımı ve otomatik ölçeklenebilirlikten izleme ve loglama süreçlerine kadar birçok alanda en iyi uygulamaları takip etmek, mikroservis mimarisini daha sağlam hale getirir. Bu yöntemler, geliştirme sürecini kolaylaştırır, altyapı maliyetlerini optimize eder ve uygulamaların daha esnek bir yapıda çalışmasını sağlar.
Ek B: Mikroservis Mimarisi için Desenler ve Anti-Desenler
Mikroservis mimarisi, dağıtık sistemlerdeki esneklik, ölçeklenebilirlik ve bağımsız geliştirme avantajları nedeniyle popüler bir yaklaşım haline gelmiştir. Ancak, mikroservis tabanlı sistemler doğru desenler uygulanmadığında yönetimi zor ve karmaşık hale gelebilir. Bu bölümde, mikroservis mimarisi için en iyi pratik desenleri ve kaçınılması gereken anti-desenleri inceleyeceğiz.
————————
Mikroservis Mimarisi için Önerilen Desenler
Mikroservis mimarisinde yaygın olarak kullanılan ve başarılı sonuçlar sağlayan desenler şunlardır:
————————
1. API Gateway Deseni
API Gateway deseni, istemciler ve mikroservisler arasındaki trafiği yönetmek için merkezi bir giriş noktası sağlar.
- Nasıl Çalışır?: İstemciler API Gateway üzerinden mikroservislere erişir. Gateway, gelen talepleri uygun mikroservise yönlendirir, güvenlik ve yük dengeleme sağlar.
- Avantajları:
- Tüm API çağrıları merkezi bir noktadan yönetilir.
- Güvenlik ve oran sınırlaması gibi kurallar merkezi olarak uygulanabilir.
- Mikroservislerin doğrudan istemciyle bağlantısı olmadığı için mimari daha güvenlidir.
Kullanım Örneği: Kullanıcı doğrulama ve yetkilendirme işlemleri API Gateway üzerinde yapılabilir.
————————
2. Saga Deseni
Saga Deseni, mikroservislerde dağıtık işlemleri yönetmek için kullanılan bir modeldir. Her işlem, bağımsız mikroservisler arasında bir dizi küçük işlemler (adımlar) şeklinde yürütülür.
- Nasıl Çalışır?: Her mikroservis, kendi işlem adımını tamamladıktan sonra bir sonraki servise geçer. Eğer bir hata oluşursa, geri alma işlemleri başlatılır.
- İki Çeşit Saga Modeli:
- Koreografi: Her mikroservis diğer servisin tamamlanmasını beklemeden kendi işlemini yürütür.
- Orkestrasyon: Merkezi bir koordinatör tüm adımları yönetir ve sırayla çağrı yapar.
- Avantajları:
- Dağıtık işlemlerde veri tutarlılığı sağlanır.
- Her mikroservis, kendi işlemlerini bağımsız olarak yönetebilir.
Kullanım Örneği: Bir e-ticaret sitesinde, siparişin alınması, stok kontrolü ve ödeme işlemlerinin sırayla yürütülmesi.
————————
3. Circuit Breaker (Devre Kesici) Deseni
Circuit Breaker Deseni, başarısız servis çağrılarını durdurarak sistemin aşırı yüklenmesini engeller.
- Nasıl Çalışır?: Eğer bir servis başarısız yanıt veriyorsa, devre kesici o servise yapılan çağrıları durdurur. Belirli bir süre sonra devre kesici tekrar açılarak servisin durumu test edilir.
- Avantajları:
- Başarısız olan servislere sürekli çağrı yapılmasını engeller.
- Tüm sistemi korur, başarısızlıkların yayılmasını önler.
Kullanım Örneği: Ödeme mikroservisi geçici olarak kullanılamazsa, kullanıcıya geçici bir hata mesajı gösterilir.
————————
4. Event Sourcing (Olay Kaynağı) Deseni
Event Sourcing Deseni, veritabanı işlemlerini olaylar olarak kaydetmeyi ve geçmişteki her durumu izlemeyi sağlar.
- Nasıl Çalışır?: Her veri değişikliği bir olay olarak kaydedilir ve olaylar daha sonra kullanılarak veri yeniden oluşturulabilir.
- Avantajları:
- Veritabanındaki tüm değişiklikler geçmişe yönelik izlenebilir.
- Geriye dönük işlem yapmayı ve hata düzeltmeyi kolaylaştırır.
Kullanım Örneği: Bankacılık işlemlerinde tüm işlemlerin izlenmesi ve geri alınması gerektiğinde.
————————
5. CQRS (Command and Query Responsibility Segregation)
CQRS, veri sorgulama (query) ve veri güncelleme (command) işlemlerinin ayrı olarak ele alınmasını sağlayan bir desendir.
- Nasıl Çalışır?: Veriyi değiştiren ve sorgulayan işlemler ayrılır. Veri güncelleme komutları yazma veritabanına giderken, sorgular okuma veritabanından yapılır.
- Avantajları:
- Performans artırımı sağlar.
- Karmaşık veri yapılarının yönetimini kolaylaştırır.
Kullanım Örneği: E-ticaret sitesinde stok bilgisi güncelleme ve sorgulama işlemlerinin ayrı olarak yapılması.
————————
6. Database per Service (Servis Başına Veritabanı) Deseni
Database per Service Deseni, her mikroservisin kendine ait bir veritabanına sahip olmasını önerir.
- Nasıl Çalışır?: Her mikroservis yalnızca kendi veritabanına erişir ve veri paylaşımı gerektiğinde servisler arasında API çağrıları yapılır.
- Avantajları:
- Servisler bağımsız hale gelir ve veri izolasyonu sağlanır.
- Her servisin veritabanını kendi ihtiyaçlarına göre optimize etmesi mümkün olur.
Kullanım Örneği: Kullanıcı yönetimi ve sipariş işlemleri için ayrı veritabanları kullanmak.
————————
Mikroservis Mimarisi için Anti-Desenler
Mikroservis mimarilerinde başarısız sonuçlara yol açabilen ve kaçınılması gereken bazı anti-desenler de bulunmaktadır:
————————
1. God Service (Tanrı Servis) Anti-Deseni
God Service, tüm işlemleri ve veriyi merkezi bir serviste toplamak anlamına gelir. Bu durum, servisin aşırı karmaşık hale gelmesine ve bakımının zorlaşmasına yol açar.
- Sorunlar:
- Tek bir servis çok fazla sorumluluğa sahip olur.
- Bakımı ve test edilmesi zorlaşır, hata yapma olasılığı artar.
Kaçınma Yolu: İşlevleri ve veriyi ayrı mikroservislere dağıtarak her bir servisin tek bir sorumluluğa odaklanmasını sağlayın.
————————
2. Shared Database (Paylaşılan Veritabanı) Anti-Deseni
Paylaşılan veritabanı, birden fazla mikroservisin aynı veritabanını kullanması durumudur. Bu durum servislerin birbirine bağımlı hale gelmesine neden olur.
- Sorunlar:
- Veritabanı şeması değişiklikleri tüm servislere etki eder.
- Bağımsız olarak ölçeklenme zorluğu yaşanır.
Kaçınma Yolu: Her mikroservisin kendi veritabanına sahip olmasını sağlayarak veri izolasyonu ve bağımsız ölçeklenebilirlik sağlayın.
————————
3. Distributed Monolith (Dağıtık Monolit) Anti-Deseni
Dağıtık monolit, mikroservislerin bağımsız çalışmaması ve sıkı bir şekilde birbirine bağlı olmasıdır. Bu, aslında mikroservislerin monolit yapıda gibi çalışmasına yol açar.
- Sorunlar:
- Herhangi bir değişiklik, tüm sistemi etkiler.
- Mikroservislerin bağımsız olarak güncellenmesi veya ölçeklenmesi zorlaşır.
Kaçınma Yolu: Mikroservislerin birbirinden bağımsız çalışmasını sağlayacak şekilde tasarım yapın ve bağımlılıkları minimize edin.
————————
4. Chatty Service (Konuşkan Servis) Anti-Deseni
Chatty Service, mikroservislerin gereğinden fazla birbirleriyle iletişim kurmasını ifade eder. Bu durum, ağ trafiğini artırır ve performansı olumsuz etkiler.
- Sorunlar:
- Mikroservisler arasında çok sayıda istek gönderildiğinde ağ gecikmeleri artar.
- Servisler arası iletişim maliyetli hale gelir.
Kaçınma Yolu: Veriyi mümkün olduğunca yerel olarak işleyin ve servisler arasındaki veri transferini minimize edin. Veriyi gruplamak ve toplu işlemler yapmak bu sorunu hafifletebilir.
————————
5. Not Invented Here (Burada İcat Edilmedi) Anti-Deseni
Bu anti-desende, ekipler genellikle dış kütüphaneleri veya çözümleri kullanmak yerine her şeyi kendi başlarına geliştirmeye çalışır. Bu, zaman ve kaynak israfına yol açabilir.
- Sorunlar:
- Zaman kaybına neden olur, mevcut çözümler daha hızlı entegrasyon sağlar.
- Geliştirme maliyetleri artar ve bakımı zorlaşır.
Kaçınma Yolu: Uygulama gereksinimlerinize uygun hazır çözümleri ve kütüphaneleri kullanarak geliştirme sü
recini hızlandırın.
————————
Sonuç
Bu desenler ve anti-desenler, mikroservis mimarisinde doğru ve yanlış yaklaşımları anlamak için rehber niteliğindedir. API Gateway, Saga, Circuit Breaker gibi desenler, mikroservislerin dayanıklılığını, ölçeklenebilirliğini ve performansını artırırken; God Service, Shared Database, Distributed Monolith gibi anti-desenler, mikroservis mimarisinin avantajlarını kullanmayı zorlaştırır. Bu nedenle, mikroservis mimarisini tasarlarken her bir servisin bağımsız, esnek ve kendi sorumluluğunda çalışmasını sağlayan en iyi uygulamaları tercih edin.
Ek C: Sorun Giderme ve Performans İyileştirme
Mikroservis mimarisinde, sistemde birçok bağımsız servis olduğundan sorun giderme ve performans iyileştirme kritik öneme sahiptir. Dağıtık yapının getirdiği karmaşıklık, sorunların tanımlanması ve çözülmesi sürecini zorlaştırabilir. Bu bölümde, mikroservis mimarisinde sık karşılaşılan sorunları gidermek ve performansı artırmak için en iyi pratikleri ve önerileri ele alacağız.
————————
1. İzleme ve Loglama
Sorunları hızlıca tespit edebilmek için sistemin etkin bir şekilde izlenmesi ve loglanması gereklidir.
- Merkezi Loglama: Dağıtık yapıdaki mikroservislerin loglarını merkezi bir yerde toplayarak erişilebilir hale getirin. ELK Stack (Elasticsearch, Logstash, Kibana) veya Graylog gibi merkezi loglama araçları ile tüm mikroservislerin loglarını tek bir platformda toplayabilir ve analiz edebilirsiniz.
- Dağıtık İzleme: Spring Cloud Sleuth ve Zipkin kullanarak mikroservislerin performansını ve aralarındaki iletişimi izleyin. Bu araçlar, her bir işlem için bir izleme kimliği (trace ID) oluşturarak işlemlerin takibini sağlar.
- Metrik İzleme: Mikroservislerin CPU, bellek kullanımı, istek sayısı gibi metriklerini toplamak ve analiz etmek için Prometheus ve Grafana gibi araçları kullanın. Bu metrikler, performans sorunlarını erken tespit etmenize yardımcı olur.
————————
2. Performans İyileştirme
Mikroservislerin performansını artırmak, sistemin yanıt süresini iyileştirir ve kullanıcı deneyimini geliştirir.
- Önbellekleme: Sık kullanılan veriler için Redis veya Memcached gibi dağıtık önbellekleme çözümleri kullanarak veritabanı yükünü azaltın ve yanıt süresini iyileştirin.
- Veritabanı Optimizasyonu: Veritabanı sorgularını optimize edin, gereksiz sorgulardan kaçının ve karmaşık sorgular için uygun indeksler oluşturun. Read Replica kullanarak okuma sorgularını dağıtabilir ve veritabanı performansını artırabilirsiniz.
- Asenkron İletişim: Mikroservisler arasındaki iletişimi asenkron hale getirerek bağımlılıkları azaltın. Apache Kafka veya RabbitMQ gibi mesajlaşma sistemleri, yoğun veri transferi gerektiren işlemler için idealdir.
- İstek Gruplama ve Toplu İşlemler: Mikroservisler arasındaki veri alışverişini mümkün olduğunca toplu olarak yapın. Tek seferde çoklu veri isteği göndermek, ağ trafiğini azaltır ve daha hızlı yanıt alınmasını sağlar.
- Yüksek Erişilebilirlik ve Yük Dengeleme: Mikroservislerin ölçeklenebilir ve yüksek erişilebilir olması için Load Balancer (ELB, NGINX) kullanın. Trafiği dengelemek, servislerin aşırı yük altında kalmasını engeller.
————————
3. Hata Yönetimi ve Dayanıklılık
Mikroservislerin bağımsız çalışabilmesi, hatalara karşı dayanıklı olmalarıyla mümkündür.
- Circuit Breaker (Devre Kesici) Kullanımı: Spring Cloud Circuit Breaker veya Resilience4j gibi devre kesici kütüphanelerle başarısız servis çağrılarını durdurarak sistemin aşırı yüklenmesini önleyin.
- Retry ve Fallback Mekanizmaları: Geçici hatalar için Retry mekanizması ile belirli bir sayıda tekrar deneme yapılmasını sağlayın. Eğer hata devam ederse, kullanıcılara alternatif bir yanıt sunmak için Fallback mekanizmaları kullanın.
- Timeout Ayarları: Mikroservislerin birbirini beklemesini önlemek için servis çağrılarına belirli bir süre sınırı (timeout) koyun. Bu, zaman aşımına uğrayan işlemler için sistemin beklememesini sağlar.
————————
4. Bağımlılıkların Yönetimi
Mikroservislerde bağımlılıkları yönetmek, sistemin karmaşıklığını azaltır ve esnekliğini artırır.
- API Gateway Kullanımı: Mikroservisler arasındaki bağımlılıkları yönetmek için API Gateway kullanarak tüm trafik akışını merkezi bir noktadan yönetin. API Gateway, mikroservisleri dış dünyadan soyutlayarak bağımlılıkların kontrolünü kolaylaştırır.
- Versiyon Yönetimi: Mikroservislerde API değişikliklerini yönetmek için sürüm kontrolü uygulayın. Eski API sürümlerini koruyarak, eski istemcilerin uyumsuzluk yaşamadan çalışmasını sağlayabilirsiniz.
- Servis Keşfi: Spring Cloud Netflix Eureka gibi servis keşif araçları kullanarak mikroservislerin birbirini dinamik olarak bulmasını sağlayın. Bu, statik IP bağımlılığını ortadan kaldırır ve servislerin hareketli olmasına izin verir.
————————
5. Güvenlik İyileştirmeleri
Mikroservislerde güvenlik, dağıtık yapıda olmasından dolayı daha karmaşıktır. Güvenliği sağlamak için birkaç temel prensip izlenmelidir.
- Kimlik Doğrulama ve Yetkilendirme: Mikroservislerde güvenliği artırmak için OAuth2 veya JWT kullanarak kimlik doğrulama ve yetkilendirme sağlayın. API Gateway seviyesinde kullanıcı erişimlerini kontrol edin.
- TLS (Transport Layer Security) Kullanımı: Mikroservisler arasındaki veri trafiğini şifrelemek için TLS kullanarak iletişimin güvenli olmasını sağlayın.
- Hassas Bilgilerin Güvenli Yönetimi: API anahtarları, veritabanı şifreleri gibi hassas bilgileri AWS Secrets Manager, HashiCorp Vault veya benzeri güvenlik çözümlerinde saklayın.
————————
6. CI/CD ve Dağıtım Süreçleri
Sürekli entegrasyon ve sürekli dağıtım (CI/CD), mikroservislerin hızlı ve güvenilir bir şekilde güncellenmesini sağlar.
- CI/CD Pipeline Kurulumu: Jenkins, GitLab CI/CD veya CircleCI gibi araçlarla CI/CD pipeline’ları kurarak her değişiklik sonrası otomatik test ve dağıtım süreci oluşturun.
- Küçük ve Sık Güncellemeler: Büyük güncellemeler yerine küçük ve sık güncellemeler yaparak, her değişikliğin hızlı bir şekilde test edilip dağıtılmasını sağlayın.
- Mavi/Yeşil Dağıtım: Blue/Green Deployment stratejisi ile mevcut sürüm çalışırken yeni sürümün test edilmesini sağlayın ve yeni sürümde sorun yoksa trafiği yönlendirin. Bu, kesintisiz bir dağıtım sağlar.
- Canary Dağıtımı: Küçük bir kullanıcı grubuna yeni sürümü dağıtarak performansı test edin ve sorun yoksa tüm kullanıcılara açın.
————————
7. Veritabanı Optimizasyonları
Veritabanı işlemleri genellikle mikroservis performansını etkileyen en büyük faktörlerden biridir.
- Veritabanı Bağlantı Havuzu: Her mikroservisin, veritabanına aynı anda yapacağı bağlantı sayısını kontrol edin. Bağlantı havuzu kullanarak veritabanı bağlantılarını yönetebilir ve veritabanı performansını artırabilirsiniz.
- Veritabanı Yük Dengeleme: Mikroservislerin veritabanı üzerindeki okuma yükünü dağıtmak için Read Replica yapılandırması kullanarak okuma işlemlerini kopya veritabanlarına yönlendirin.
- Veritabanı Şeması Tasarımı: Karmaşık sorguları optimize edin, gereksiz veri işlemelerinden kaçının. Özellikle ilişkisel veritabanlarında tabloları doğru bir şekilde normalleştirin ve indeksleme yaparak sorgu performansını artırın.
————————
8. Gereksiz Bağımlılıklardan Kaçınma
Mikroservislerin bağımsız olması, sistemin esnekliğini artırır. Gereksiz bağımlılıklardan kaçınarak, mikroservisleri daha yönetilebilir hale getirebilirsiniz.
- Bağımsız Veritabanları: Her mikroservisin kendi veritabanına sahip olmasını sağlayarak veri bağımsızlığını artırın.
- Ortak Veritabanı Şeması Kullanmayın: Mikroservislerin bağımsız olarak evrimleşmesini sağlamak için ortak bir veritabanı şemasından kaçının. Bunun yerine API çağrıları ile veri alışverişini tercih edin.
- Bağlantı Sayısını Azaltın: Mikroservislerin birbirine aşırı bağımlı olmasını önlemek için, her mikroservisin mümkün olduğunca bağımsız çalışmasını sağlayın.
————————
####
- Timeout ve Geri Alma (Rollback) Mekanizmaları
Mikroservislerde zaman aşımı ve geri alma mekanizmaları kullanarak sistemin stabilitesini artırabilirsiniz.
- Timeout Yönetimi: Her bir mikroservis çağrısı için belirli bir zaman aşımı süresi tanımlayın. Servislerin birbirini beklemesi, sistem performansını olumsuz etkileyebilir.
- Geri Alma İşlemleri: Özellikle dağıtık işlemlerde, bir mikroservis başarısız olduğunda geri alma işlemlerini çalıştırarak veritabanı değişikliklerini geri alın. Saga deseni ile dağıtık geri alma işlemlerini otomatikleştirebilirsiniz.
————————
10. Yük Testi ve Performans Testi
Mikroservislerin yoğun trafik altındaki performansını test etmek, beklenmedik sorunları önlemek için önemlidir.
- Yük Testleri: JMeter veya Gatling gibi yük testi araçları ile mikroservislerin yüksek trafik altındaki davranışını test edin.
- Performans Testleri: Uygulamanın performansını ölçmek için gerçekçi kullanım senaryolarına göre performans testi yapın. Bu testler, sistemin darboğazlarını belirlemenize yardımcı olur.
- Stres Testleri: Aşırı yük altında mikroservislerin ne kadar dayanıklı olduğunu görmek için stres testleri yapın.
————————
Sonuç
Mikroservis mimarisinde sorun giderme ve performans iyileştirme, dağıtık yapıdaki karmaşıklıktan dolayı dikkat ve planlama gerektirir. İzleme ve loglama, hata yönetimi, güvenlik önlemleri, veritabanı optimizasyonları ve yük testleri gibi tekniklerle mikroservislerin performansını artırabilir ve sorunları hızla çözebilirsiniz. Bu en iyi uygulamaları takip ederek mikroservis mimarinizin stabilitesini ve performansını en üst düzeye çıkarabilirsiniz.
Ek D: Kaynaklar ve İleri Okuma
Mikroservis mimarisi ve Spring Cloud konularında daha derin bilgi edinmek isteyenler için birçok kaynak mevcuttur. Aşağıda, bu alanlarda uzmanlaşmanıza yardımcı olabilecek kitaplar, çevrimiçi kaynaklar, bloglar ve konferanslar yer almaktadır. Bu kaynaklar, hem temel kavramları anlamak hem de daha ileri düzeyde bilgi edinmek isteyenler için rehber niteliğindedir.
————————
1. Kitaplar
- "Building Microservices: Designing Fine-Grained Systems" by Sam Newman
- Bu kitap, mikroservis mimarisinin temel ilkelerini ve desenlerini açıklamakta olup, mikroservislerin nasıl tasarlanması gerektiğini anlatır.
- Öne Çıkan Konular: Mikroservis tasarımı, bağımsız geliştirme, test ve dağıtım süreçleri.
- "Microservices Patterns: With Examples in Java" by Chris Richardson
- Mikroservis desenleri ve anti-desenlerini açıklayan kapsamlı bir kaynak. Java ile örneklendirilmiş çözüm yolları sunar.
- Öne Çıkan Konular: Saga deseni, API Gateway, dağıtık veritabanı yönetimi, dayanıklılık desenleri.
- "Spring Microservices in Action" by John Carnell
- Spring ekosistemi kullanarak mikroservislerin nasıl geliştirileceğini adım adım anlatan bir kitap. Özellikle Spring Boot, Spring Cloud ve Netflix OSS araçları üzerinde yoğunlaşır.
- Öne Çıkan Konular: Spring Boot ile mikroservis geliştirme, Spring Cloud bileşenleri, güvenlik ve dayanıklılık desenleri.
- "Cloud Native Java: Designing Resilient Systems with Spring Boot, Spring Cloud, and Cloud Foundry" by Josh Long and Kenny Bastani
- Spring Boot ve Spring Cloud ile bulut tabanlı dayanıklı uygulamalar geliştirmek isteyenler için detaylı bir kaynak.
- Öne Çıkan Konular: Cloud Native uygulama geliştirme, Spring Cloud bileşenleri, güvenlik, izleme ve loglama.
- "The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win" by Gene Kim, Kevin Behr, and George Spafford
- DevOps ve yazılım geliştirme süreçleri üzerine roman formatında bir kitap. DevOps ilkelerinin mikroservis mimarisindeki önemini anlamak için harika bir okuma.
- Öne Çıkan Konular: DevOps kültürü, CI/CD süreçleri, yazılım geliştirme yönetimi.
————————
2. Bloglar ve Makaleler
- Spring.io Blog
- Spring Framework ve Spring Cloud güncellemelerini içeren resmi blog. Mikroservislerin Spring Cloud ile nasıl geliştirilip dağıtılacağını anlatan yazılar içerir.
- https://spring.io/blog
- Chris Richardson's Microservices.io
- Mikroservis desenleri, anti-desenler ve mikroservis mimarisi hakkında rehber niteliğinde makaleler içerir. Özellikle desenlere ve dağıtık sistem yönetimine odaklanır.
- https://microservices.io
- Martin Fowler's Blog
- Yazılım mimarisi üzerine kapsamlı yazılar yazan Martin Fowler, mikroservis mimarisi ve dağıtık sistemler konusunda birçok makale sunmaktadır.
- https://martinfowler.com
- AWS Blog - Microservices Category
- AWS üzerinde mikroservisler oluşturma, dağıtım, ölçeklendirme ve izleme konularında detaylı makaleler içeren bir blog.
- https://aws.amazon.com/blogs/
- Netflix Tech Blog
- Netflix’in kendi mikroservis mimarisini nasıl geliştirdiğini ve yönetimini nasıl sağladığını anlatan makaleler sunar. Özellikle dayanıklılık, ölçeklenebilirlik ve dağıtık izleme konularında değerli içerikler barındırır.
- https://netflixtechblog.com
————————
3. Çevrimiçi Kurslar
- Udemy - "Microservices with Spring Cloud" by Ken Krueger
- Bu kurs, Spring Boot ve Spring Cloud kullanarak mikroservislerin nasıl oluşturulacağını öğretmektedir.
- Kapsam: API Gateway, Config Server, Eureka, Feign Client, Circuit Breaker.
- Coursera - "Google Cloud Platform Fundamentals: Core Infrastructure"
- Google Cloud Platform üzerinde mikroservislerin dağıtımı ve yönetimi üzerine bir kurs.
- Kapsam: Google Kubernetes Engine (GKE), CI/CD süreçleri, dağıtık izleme ve güvenlik.
- Pluralsight - "Building Microservices with Spring Boot and Spring Cloud"
- Spring Boot ve Spring Cloud kullanarak mikroservis geliştirme sürecini adım adım açıklayan bir kurs.
- Kapsam: Spring Cloud bileşenleri, dayanıklılık desenleri, merkezi yapılandırma yönetimi.
- edX - "Microsoft Azure Solutions for AWS Developers"
- AWS üzerinde geliştirme yapan geliştiriciler için Microsoft Azure çözümlerine geçiş kursu. Farklı bulut platformlarında mikroservis yönetimi konusunda bakış açınızı genişletir.
- Kapsam: Azure ve AWS’de mikroservis dağıtımı, CI/CD, güvenlik ve izleme.
————————
4. Konferanslar ve Etkinlikler
- SpringOne Platform
- Spring ve bulut tabanlı çözümler üzerine yapılan bu konferans, Spring ekosisteminde yeni gelişmeleri öğrenmek için harika bir fırsattır.
- Kapsam: Spring Boot, Spring Cloud, Cloud Native uygulamalar, DevOps.
- Microservices Conference by O’Reilly
- Mikroservis mimarisi hakkında dünyanın önde gelen konuşmacılarının yer aldığı bu konferansta mikroservislerin mimarisi, performans yönetimi ve en iyi uygulamalar tartışılır.
- Kapsam: Mikroservis desenleri, anti-desenler, performans optimizasyonu.
- KubeCon + CloudNativeCon
- Kubernetes ve bulut tabanlı çözümler üzerine yoğunlaşan bu etkinlikte, mikroservislerin Kubernetes üzerinde yönetimi ve izlenmesi konuları ele alınır.
- Kapsam: Kubernetes, servis mesh, dağıtık izleme, CI/CD.
- AWS re:Invent
- Amazon Web Services (AWS) tarafından düzenlenen bu konferans, mikroservislerin AWS üzerinde dağıtımı, ölçeklendirilmesi ve yönetimi ile ilgili oturumlar sunar.
- Kapsam: AWS Fargate, Lambda, API Gateway, CloudWatch.
- QCon Software Development Conference
- Yazılım geliştirme ve mimari üzerine kapsamlı konuşmalar sunan bu konferans, mikroservis mimarisi ve modern yazılım geliştirme üzerine yoğunlaşır.
- Kapsam: Mikroservis mimarisi, DevOps, CI/CD, dayanıklılık desenleri.
————————
5. Araçlar ve Çerçeveler
- Spring Cloud:
- Mikroservis mimarisini yönetmek için gerekli yapı taşlarını sunar. Config Server, Eureka, Circuit Breaker gibi bileşenleri içerir.
- https://spring.io/projects/spring-cloud
- Docker:
- Mikroservisleri konteynerler içinde çalıştırmak için kullanılır. Taşınabilirlik ve kolay dağıtım sağlar.
- https://www.docker.com
- Kubernetes:
- Mikroservislerin otomatik ölçeklendirme, yük dengeleme ve self-healing gibi özelliklerle yönetilmesini sağlayan konteyner orkestrasyon platformu.
- https://kubernetes.io
- ELK Stack (Elasticsearch, Logstash, Kibana):
- Mikroservislerin loglarını toplayarak analiz etmenizi sağlayan log yönetim sistemi.
- https://www.elastic.co/elk-stack
- Prometheus ve Grafana:
- Mikroservislerin performans metriklerini toplayıp görselleştirmenizi sağlayan izleme araçları.
- https://prometheus.io
- https://grafana.com
- HashiCorp Vault:
- Mikroservislerde kullanılan hassas bilgilerin güvenli bir şekilde saklanması ve yönetilmesi için güvenlik aracı.
- https://www.vaultproject.io
————————
6. Github Depoları
- Spring Cloud Samples:
- Spring Cloud özelliklerini örnekleyen resmi Spring Cloud örnekleri.
- [https://github.com/spring-cloud-samples](https://github.com/s
pring-cloud-samples)
- Microservices.io Patterns:
- Chris Richardson’ın mikroservis desenlerini açıklayan ve örnekleyen GitHub deposu.
- https://github.com/microservices-patterns
- Netflix OSS:
- Netflix tarafından geliştirilen ve mikroservislerde dayanıklılığı artıran açık kaynak araçları içeren bir depo.
- https://github.com/Netflix
- Awesome Microservices:
- Mikroservis mimarisi ile ilgili araçlar, kütüphaneler ve kaynaklar için toplu bir liste.
- https://github.com/mfornos/awesome-microservices
————————
Sonuç
Bu kaynaklar, mikroservis mimarisi ve Spring Cloud hakkında daha ileri bilgi edinmek isteyenler için kapsamlı bir öğrenme yolculuğu sunar. Kitaplardan çevrimiçi kurslara, bloglardan araç ve kütüphanelere kadar birçok kaynak, mikroservis mimarisinin çeşitli yönlerini anlamanızı ve profesyonel olarak uygulamanızı kolaylaştıracaktır. İleri okuma ve araştırmalar yaparak, mikroservis mimarisinde uzmanlaşabilir ve daha etkili sistemler geliştirebilirsiniz.
Aşağıda, bir e-ticaret uygulaması için örnek bir Spring Cloud mikroservis senaryosu ve bu senaryoyu nasıl çözüme kavuşturabileceğinize dair ayrıntılı bir rehber bulunmaktadır. Bu senaryoda, bir sipariş sistemini geliştirmek için Spring Cloud’un çeşitli bileşenlerini kullanarak mikroservisleri bir arada nasıl çalıştırabileceğinizi göreceksiniz.
————————
Senaryo: E-Ticaret Sipariş Sistemi
Bir e-ticaret uygulamasında kullanıcıların ürün siparişi verebildiği bir sipariş sistemi kurmak istiyorsunuz. Bu sistemde her mikroservisin belirli bir görevi vardır:
- Kullanıcı Servisi (User Service): Kullanıcı bilgilerini yönetir.
- Ürün Servisi (Product Service): Ürünlerin bilgilerini ve stok durumunu yönetir.
- Sipariş Servisi (Order Service): Kullanıcı siparişlerini yönetir.
- Ödeme Servisi (Payment Service): Ödeme işlemlerini yönetir.
Uygulamanızın belirli gereksinimleri var:
- Her mikroservisin bağımsız olarak çalışabilmesi.
- Mikroservisler arası iletişimin kolayca sağlanması.
- Merkezi bir yapılandırma yönetimi.
- Servis keşfi ve yük dengeleme.
- Kullanıcı ve ürün servisine erişimi API Gateway üzerinden sağlama.
- Devre kesici ve dayanıklılık mekanizmaları ile güvenli bir yapı.
————————
Çözüm: Spring Cloud ile Mikroservis Yapısının Kurulması
1. Proje Yapısı ve Bağımlılıklar
Spring Initializr veya bir Maven yapılandırması kullanarak dört mikroservis oluşturun: User Service, Product Service, Order Service, ve Payment Service. Ayrıca, API Gateway, Config Server, ve Eureka Server bileşenlerini de ekleyin.
pom.xml veya build.gradle dosyanıza Spring Cloud bağımlılıklarını ekleyin:
- Spring Cloud Starter Netflix Eureka (Servis Keşfi)
- Spring Cloud Config Server (Merkezi Yapılandırma)
- Spring Cloud Starter OpenFeign (Mikroservisler arası iletişim)
- Spring Cloud Gateway (API Gateway)
- Resilience4j (Devre Kesici)
————————
2. Merkezi Yapılandırma Yönetimi - Config Server
Config Server ile her mikroservisin yapılandırmalarını merkezi bir yerden yönetin. Config Server, mikroservislerin yapılandırma dosyalarını bir Git deposundan alır.
- Config Server Uygulaması: Spring Boot projenize @EnableConfigServer anotasyonunu ekleyin.
- Yapılandırma Dosyası: application.yml dosyasına Git deposunun URI bilgisini ekleyin.
server:
port: 8888
spring:
cloud:
config:
server:
git:
uri: https://github.com/username/config-repo
clone-on-start: true
Mikroservislerin yapılandırma dosyalarını Git’te {servis-adı}-{profil}.yml formatında saklayabilirsiniz.
————————
3. Servis Keşfi - Eureka Server
Her mikroservisin birbirini bulabilmesi için Eureka Server kullanarak servis keşfini sağlayın.
- Eureka Server Uygulaması: Spring Boot projesine @EnableEurekaServer anotasyonunu ekleyin.
- Yapılandırma: application.yml dosyasında Eureka Server’ı yapılandırın.
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
Her mikroservis @EnableEurekaClient anotasyonunu kullanarak Eureka Server’a kaydedilir. Mikroservislerin yapılandırma dosyalarına da Eureka bağlantısı eklenir:
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
————————
4. API Gateway ile Trafik Yönetimi
API Gateway mikroservisleri dış dünyaya açmak için kullanılır. API Gateway sayesinde her mikroservis ayrı ayrı değil, tek bir giriş noktası üzerinden çağrılır. Bu, güvenlik ve yük dengeleme için de idealdir.
- API Gateway Uygulaması: Spring Boot projesine @EnableGateway anotasyonunu ekleyin.
- Yönlendirme Yapılandırması: application.yml dosyasında her mikroservis için yönlendirmeler yapın.
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://USER-SERVICE
predicates:
- Path=/users/**
- id: product-service
uri: lb://PRODUCT-SERVICE
predicates:
- Path=/products/**
Bu yapılandırma, /users/** isteklerini user-servicee, /products/** isteklerini product-servicee yönlendirir. Burada lb:// ifadesi, yük dengeleme (load balancing) için kullanılır.
————————
5. Mikroservisler Arası İletişim - Feign Client
Mikroservisler birbirleriyle Feign Client kullanarak iletişim kurabilir. Örneğin, Order Service, sipariş verilen ürünlerin bilgilerini almak için Product Service’i çağırabilir.
ProductClient Arayüzü:
@FeignClient(name = "product-service")
public interface ProductClient {
@GetMapping("/products/{id}")
Product getProductById(@PathVariable("id") Long id);
}
OrderService’de Feign Kullanımı:
@Service
public class OrderService {
private final ProductClient productClient;
public OrderService(ProductClient productClient) {
this.productClient = productClient;
}
public Order placeOrder(Long userId, Long productId) {
Product product = productClient.getProductById(productId);
// Sipariş oluşturma işlemleri
return new Order(userId, productId, product.getPrice());
}
}
————————
6. Devre Kesici ve Dayanıklılık - Resilience4j
Mikroservislerin güvenilirliğini artırmak için devre kesici (Circuit Breaker) deseni kullanın. Resilience4j kullanarak, bir mikroservis geçici olarak çalışmıyorsa devre kesici ile bu servise çağrı yapılmasını durdurabilirsiniz.
application.yml dosyasında devre kesici etkinleştirme:
resilience4j:
circuitbreaker:
instances:
productClient:
registerHealthIndicator: true
slidingWindowSize: 10
minimumNumberOfCalls: 5
failureRateThreshold: 50
waitDurationInOpenState: 10000
Bu ayarlar, productClient Feign Client için devre kesici yapılandırmasını sağlar. failureRateThreshold: 50 ifadesi, hata oranı %50’yi geçtiğinde devreyi açar ve waitDurationInOpenState: 10000 (10 saniye) süresi boyunca çağrılar engellenir.
@CircuitBreaker Anotasyonu:
@Service
public class OrderService {
private final ProductClient productClient;
public OrderService(ProductClient productClient) {
this.productClient = productClient;
}
@CircuitBreaker(name = "productClient", fallbackMethod = "fallbackProduct")
public Product getProduct(Long productId) {
return productClient.getProductById(productId);
}
public Product fallbackProduct(Long productId, Throwable ex) {
return new Product(productId, "Default Product", 0.0);
}
}
@CircuitBreaker ile hata durumunda fallbackProduct metodu çalıştırılır ve default bir yanıt döner.
————————
7. Dağıtık İzleme ve Loglama - Zipkin ve Sleuth
Zipkin ve Sleuth, mikroservisler arasında yapılan çağrıların izlenmesini sağlar. Bu araçlar sayesinde, bir isteğin hangi mikroservisler arasında nasıl geçtiğini ve nerede yavaşladığını görebilirsiniz.
- Spring Cloud Sleuth: Her mikroservis çağrısı için benzersiz bir traceId oluşturur.
- Zipkin Server: İzleme verilerini toplar ve görselleştirir.
Zipkin Bağımlılığı Ekleyin:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
Sleuth ile İzleme: Her mikroservise spring-cloud-starter-sleuth bağımlılığını ekleyin. Bu sayede, yapılan her çağrı otomatik olarak izlenir ve Zipkin üzerinden görüntülenebilir.
application.yml:
spring:
sleuth:
sampler:
probability: 1.0
zipkin:
base-url: http://localhost:9411
Bu ayarlar, tüm isteklerin izlenmesini ve Zip
kin’e gönderilmesini sağlar.
————————
Sonuç
Bu senaryo, Spring Cloud’un sunduğu Config Server, Eureka Server, API Gateway, Feign Client, Resilience4j, Sleuth ve Zipkin gibi bileşenleri kullanarak bir mikroservis mimarisinin nasıl oluşturulacağını gösterdi. Böylece her mikroservis bağımsız olarak geliştirilip dağıtılabilir, servis keşfi ile diğer mikroservisleri bulabilir, API Gateway üzerinden tek bir noktadan erişilebilir, devre kesici ile hata dayanıklılığı artırılabilir ve tüm sistem izlenebilir hale gelir. Bu yapı, e-ticaret gibi karmaşık uygulamalarda mikroservis mimarisi için sağlam bir temel sağlar.