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.
Yazan
Şuayb Şimşek
Spring Boot, güvenlik, mikroservis ve cloud-native mimari konularında pratik teknik notlar paylaşan backend odaklı fullstack geliştirici.
🛠️ Adım 3: Circuit Breaker Kullanarak Bir REST Servisi Uygulama
🛠️ Adım 4: Bir REST Controller Oluşturun
▶️ Uygulamayı Çalıştırma
Uygulamayı başlatın:
BASH
./mvnw spring-boot:run
veya Gradle kullanarak:
BASH
gradle bootRun
🧪 Circuit Breaker'ı Test Etme
Circuit Breaker’ı test etmek için:
BASH
curl -X GET http://localhost:8080/api/data
🏁 Sonuç
Artık Spring Boot Circuit Breaker için üretim odaklı bir Spring Boot temeliniz var. Sonraki adımda ayarları kendi domainine uyarlayıp test ve gözlemlenebilirlik katmanını ekleyerek gerçek trafik altında doğrulayın.
JAVAExternalService.java
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!";
}
}
KOTLINExternalService.kt
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!"
}
}
JAVACircuitBreakerController.java
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();
}
}
KOTLINCircuitBreakerController.kt
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()
}
}