Spring Cloud Nedir?

Yigit Kader
4 min readJul 8, 2021

--

Selamlar herkese,

Spring Cloud, JVM tabanlı uygulamayı bulutlarda hızlı bir şekilde dağıtmak için araçlar sağlayan açık kaynaklı bir kitaplık olarak tanımlanmakta. Dağıtılmış konfigürasyon, Devre kesiciler, Global kilitler, Servis kayıtları, Yük dengeleme, Küme durumu, Yönlendirme vb. gibi çeşitli özellikler sayesinde genişletilebilir bir mekanizma ve rakiplerine göre daha iyi bir kullanıcı deneyimi sağlamakta.

Spring Cloud Özellikleri

Dağıtılmış yapılandırma(Distributed configuration)

Dağıtılmış mesajlaşma (Distributed messaging)

servisten servise aramalar (service-to-service calls)

Devre kesiciler(Circuit Breaker)

Küresel kilitler (Global locks)

Hizmet kaydı (Service registration)

Servis Keşfi (Service Discovery)

Yük dengeleme(Load balancing)

Küme durumu (Cluster state)

Yönlendirme(Routing)

SPRING CLOUD COMPONENTS

Configuration

konfigürasyon, Spring Cloud için çok önemli bir bileşenidir, çünkü tüm dağıtılmış sistemlerde sunucu tarafı ile istemci tarafı arasındaki ilişkileri haricileştirilmiş konfigürasyon şeklinde sürdürür.

Service Discovery

Microservice mimarisinde servisleriniz çok dinamik bir yapıya sahiptir.Mesela uygulamaya gelen isteklerin yoğunluğuna göre bazı microservislerinizi scale out etmeniz yani var olan instance sayısını artırmanız gerekebilir.Ya da microservice’lerinizden bazıları zamanla fail olabilir.Bunun yerine yenisi oluşturulabilir ve isteğinizi karşılayacak ip adresi zaman içerisinde değişebilir.Bu yüzden daha ayrıntılı bir yapıya ihtiyacımız var.Bu yapıya Service Discovery diyoruz.

Peki microservicelerin adresleri nasıl takip edilecek ve isteklerin hangi adrese gideceğini nasıl ve nereden öğreneceğiz?

Burada aslında işin en önemli parçası Service Registry. Bunu ayakta olan instanceların kaydını tutan bir veritabanı olarak düşünebiliriz.Dolasıyısıyla her an ulaşılabilir olmak durumundadır.Ayağa kaldırılan her instance buraya kaydolur ve belli aralıklarla bu instance’ın ayakta olup olmadığı kontrol edilir.Çünkü bu veritabanı olabildiğince güncel tutulmalıdır.Bir instance kapatılacağı zaman da unregister olarak kaydı silinir.Netflix’e ait Eureka bir service registry ürünüdür.Rest API’lar aracılığı ile yeni bir instance’ın register edilmesini veya kayıtlı olan instanceların sorgulanmasını sağlar.

2 tür service discovery patterni bulunmakta.

Client-Side Service Discovery

Bu yapıda client service registry ile iletişime geçer ve istediği domainin adresini sorar.Service registry üzerinde kayıtlı olan yani ulaşılabilir durumdaki microservice instance’larının ip adreslerini verir.Daha sonra client bir load-balancing algoritmasına göre bu microservicelerden en uygun olanı seçer ve microservice ile iletişim kurar.Gördüğünüz gibi burada client,ip adresini elde ederek microservice ile kendisi iletişim kurmaktadır.

Server-Side Service Discovery

Burada ise client bir Load Balancer(Yük Dengeleyici) ile iletişim kurar.İsteğini buraya iletir.Load Balancer ise Service Registry ile konuşarak avaliable durumdaki instance’ların listesini alır.Daha sonra da arasından kendi algoritmasına göre en uygun gördüğü instance’a client’tan aldığı isteği yönlendirir.

İkisinin arasındaki fark Client-Side Service Discovery yapısında client,instance ile kendisi iletişim kurmaktadır.Çünkü o instance’ın ip adres bilgisini service registry’e sorarak öğrenmektedir.Server-Side Service Discovery örneğinde ise request load balancer aracılığı ile instancelara iletilmektedir.

Circuit Breaker

Diyelim Sistemimize Microservice mimarisini uyguladık ve ardışık olarak birbirini request gönderen bir dizi servisimiz mevcut. Diğer bütün servisler gibi bu dizideki servislerin de down olma ihtimali var ve eğer herhangi biri requestlere cevap veremezse bu bütün akışı aksatıp bir dizi ardışık hataya sebep olabilir. Eğer bu cevap dönemeyen requesti yapan çok fazla caller olursa bu da kaynak tüketimi kritik düzeyde arttırıp bir çok servisi ve butun sistemi etkileyecek bir dizi ciddi soruna yol acabilir.
Circuit breaker bu gibi durumlarda bir devre anahtarı gibi davranarak belli bir thresholdun(eşik değeri) üstünde hata alındığında, response dönemeyen servise gelen requestleri servise iletmeden(open_state), requestlere bir hata mesajı veya bilgi verici mesajla dönüş yaparak sistemin gereksiz yere aşırı yüklenmesini engeller. Belli bir timeouttan sonra gelen requestlerin bir kısmını servise ileterek test yapıp sistem durumunu kontrol eder(half_open state).Eğer sıkıntı giderilmiş ise bütün isteklerin geçmesine izin verir (closed state) ve sistem düzeni korunmuş olur, eğer test çağrıları da hata mesajı alıyorsa, yine requestlere error donup bu döngüyü devam ettirir.

Circuit breaker, başarısız olabilecek requestler icin bir proxy gibi davranır yani gelen requestleri ve responselari dinleyip gerektiği durumda müdahale edebilecek sekilde tasarlanmıştır. Bu proxy, kaç tane requestin basarisiz oldugunu izleyip verilen parametrelere gores aksiyon alır. Eğer belirlenen bir eşik değerinden daha fazla istek fail durumuna düşmüş ise gelen istekleri servise yönlendirmeden, callera bir hata-bilgilendirme mesaj dönerek daha fazla requestin cevap bekleyerek sistemi yormasını önler.
Bu proxynin nasıl çalıştığının state machine gösterimi aşağıdaki gibidir;

Closed: Anahtar kapalı durumdayken servise gelen isteklere belirli bir hata oranına kadar basarili bir sekilde response dönülebilmektedir. Proxy, basarisiz ve cevapsız requestler icin bir counter tutar ve bu counterin degeri, belirli bir zaman aralığında belirli bir thresholdu geçerse proxy açık duruma geçer ve yine parametre olarak verilen timeout suresinden sonra kendisini half-open konumuna alır.

Open: Anahtar açıkken gelen butun requestler servise gönderilmeden fail edilir ve response olarak bir exception veya bilgi içeren bir mesaj dondurulur.

Half-Open: Uygulamaya gelen requestlerin bir kısmı servise gönderilip response beklenir. Eğer response hepsi başarılı bir şekilde dönerse, daha önce hataya sebep olan hatanın giderildiği varsayılır ve anahtar tamamen kapatılır, counter sıfırlanır ve butun requestlerin gecişine izin verilir. Eğer gönderilen limitli requestlerden herhangi biri fail olursa problemin hala devam ettigi varsayılır ve anahtar tekrar açık duruma gelir. Timeout sıfırdan başlar hata giderilene veya müdahale edilene kadar bu döngü devam eder.

Routing and Messaging

Bu bileşenlerin her ikisi de Spring Cloud önemli bir yön ekler ve bu iletişimi sağlar. Yönlendirme Netflix Ribbon kullanır ve Feign(sahte istemci) açar, mesajlaşma Rabbit MQ veya Kafka’yı kullanır.

Feign Client (Open Feign) Kullanarak Servisler Arası İletişim Kurmak

Spring Boot uygulamalarında, bir servisten başka bir servise istek göndermek istediğimizde RestTemplate sınıfını kullanırız. Feign REST tabanlı çağrılar üzerinden bir soyutlama olarak sağlar; bu sayede mikro servisler birbirleriyle iletişim kurabilir.

API Gateway

API, Uygulama Programı Arayüzü anlamına gelir. Yazılım uygulamaları oluşturmak için bir dizi talimat, protokol ve araçtır. Yazılım bileşenlerinin nasıl etkileşime girmesi gerektiğini belirtir. API Ağ Geçidi bir sunucudur. Bir sisteme tek bir giriş noktasıdır. API Gateway, dahili sistem mimarisini kapsar. Her müşteriye göre uyarlanmış bir API sağlar. Ayrıca kimlik doğrulama, izleme, yük dengeleme, önbelleğe alma, istek şekillendirme ve yönetimi ve statik yanıt işleme gibi başka sorumlulukları da vardır.

API Gateway, istek yönlendirme, oluşturma ve protokol çevirisinden de sorumludur. İstemci tarafından yapılan tüm istekler API Ağ Geçidinden geçer. Bundan sonra, API Ağ Geçidi, istekleri uygun mikro servise yönlendirir.

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

Yigit Kader
Yigit Kader

Written by Yigit Kader

Software Engineer , Berlin , @devyigitk twitter

No responses yet

Write a response