Spring Boot Circuit Breaker

13 Mart 20253 dk okuma

Spring Boot Circuit Breaker

Spring Boot Circuit Breaker, mikro hizmetler mimarisinde ardışık hataların önlenmesi için kullanılan bir hata toleransı mekanizmasıdır. Hataları algılayarak ve sağlıksız hizmetlere aşırı istekleri durdurarak uygulamaların hataları zarif bir şekilde yönetmesine yardımcı olur. Bu kılavuz, Spring Boot'ta Resilience4j kullanarak Circuit Breaker uygulamasını adım adım açıklamaktadır.


🌟 Neden Circuit Breaker Kullanmalıyız?

  • Mikro hizmetlerde zincirleme hataları önler.
  • Uygulama dayanıklılığını artırır, aşırı hatalı istekleri durdurur.
  • Hizmet sağlığı geri kazandığında otomatik olarak iyileşir.
  • Gereksiz bekleme sürelerini önleyerek gecikmeyi azaltır.
  • Hataları yönetmek için yapılandırılabilir yeniden deneme stratejileri sunar.

🌟 Ön Koşullar

Aşağıdakilere sahip olduğunuzdan emin olun:

  • Java Development Kit (JDK) 17+
  • 📞 Maven veya Gradle kurulu
  • 🌐 Spring Boot & Spring Cloud
  • 🧐 Circuit Breaker davranışını göstermek için bir REST API

🛠️ Adım 1: Bağımlılıkları Ekleyin

Maven Yapılandırması:

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId> </dependency>

Gradle Yapılandırması:

implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'

🛠️ Adım 2: Circuit Breaker Özelliklerini Yapılandırma

application.yml dosyanızda Circuit Breaker ayarlarını tanımlayın.

resilience4j: circuitbreaker: instances: externalService: failure-rate-threshold: 50 slow-call-rate-threshold: 50 slow-call-duration-threshold: 2000ms permitted-number-of-calls-in-half-open-state: 3 sliding-window-size: 10 minimum-number-of-calls: 5 wait-duration-in-open-state: 5s

🛠️ Adım 3: Circuit Breaker Kullanarak Bir REST Servisi Uygulama

package com.example.circuitbreaker.service; import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @Service public class ExternalService { private final RestTemplate restTemplate = new RestTemplate(); @CircuitBreaker(name = "externalService", fallbackMethod = "fallbackResponse") public String callExternalAPI() { return restTemplate.getForObject("http://unreliable-service/api/data", String.class); } public String fallbackResponse(Exception e) { return "Fallback response: Service is unavailable!"; } }
package com.example.circuitbreaker.service import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker import org.springframework.stereotype.Service import org.springframework.web.client.RestTemplate @Service class ExternalService { private val restTemplate = RestTemplate() @CircuitBreaker(name = "externalService", fallbackMethod = "fallbackResponse") fun callExternalAPI(): String { return restTemplate.getForObject("http://unreliable-service/api/data", String::class.java) ?: "" } fun fallbackResponse(e: Exception): String { return "Fallback response: Service is unavailable!" } }

🛠️ Adım 4: Bir REST Controller Oluşturun

package com.example.circuitbreaker.controller; import com.example.circuitbreaker.service.ExternalService; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api") public class CircuitBreakerController { private final ExternalService externalService; public CircuitBreakerController(ExternalService externalService) { this.externalService = externalService; } @GetMapping("/data") public String fetchData() { return externalService.callExternalAPI(); } }
package com.example.circuitbreaker.controller import com.example.circuitbreaker.service.ExternalService import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api") class CircuitBreakerController(private val externalService: ExternalService) { @GetMapping("/data") fun fetchData(): String { return externalService.callExternalAPI() } }

▶️ Uygulamayı Çalıştırma

Uygulamayı başlatın:

./mvnw spring-boot:run

veya Gradle kullanarak:

gradle bootRun

🧪 Circuit Breaker'ı Test Etme

Circuit Breaker’ı test etmek için:

curl -X GET http://localhost:8080/api/data

Spring Boot Circuit Breaker ile Resilience4j, mikro hizmetlerdeki zincirleme hataları önlemeye yardımcı olur. Hataları izleyerek ve başarısız hizmetlere gereksiz çağrıları durdurarak sistem kararlılığını ve genel uygulama dayanıklılığını artırır. 🚀