Спочатку уявімо, що у вас є три мікросервіси (MS): курс, студент та реєстрація. Мікросервіс реєстрація займається записом студентів на різні курси. Ми збираємося реалізувати патерн Circuit Breaker за допомогою Resilience4j.
У вашому мікросервісі реєстрація додайте такі залежності (Resilience4j, AOP, Actuator):
org.springframework.cloud
spring-cloud-starter-circuitbreaker-resilience4j
org.springframework.boot
spring-boot-starter-aop
org.springframework.boot
spring-boot-starter-actuator
У нашому мікросервісі реєстрація є метод у сервісі (getAllCoursesByStudent
), який викликає мікросервіси курс та студент. Давайте подивимося, як ми можемо реалізувати circuit breaker для цього методу.
Спочатку ми анотуємо наш метод за допомогою анотації @CircuitBreaker
, а потім визначаємо метод fallback.
@Override
@CircuitBreaker(name = "${spring.application.name}", fallbackMethod = "getAllCoursesByStudentFallback")
public List getAllCoursesByStudent(Long id) {
List registrationList = registrationRepository.findByStudentId(id);
return registrationList.stream()
.map(registration -> courseClient.getCourseById(registration.getCourseId()))
.collect(Collectors.toList());
}
public List getAllCoursesByStudentFallback(Long id, Throwable throwable) {
return List.of(new CourseDto(0L, "Fallback Course", "Description unavailable", 0));
}
У вашому мікросервісі реєстрація оновіть конфігураційний файл (application.properties
) наступним чином:
resilience4j:
circuitbreaker:
instances:
inscription-service:
register-health-indicator: true
failure-rate-threshold: 50
minimum-number-of-calls: 5
automatic-transition-from-open-to-half-open-enabled: true
wait-duration-in-open-state: 5s
permitted-number-of-calls-in-half-open-state: 3
sliding-window-type: COUNT_BASED
sliding-window-size: 10
management:
endpoints:
web:
exposure:
include: health
Після внесення цих змін перезапустіть мікросервіс реєстрація.
Ви можете протестувати, перейшовши за адресою:
http://localhost:8083/actuator/health
(якщо порт вашого мікросервісу реєстрація — 8083).
Тепер вимкніть мікросервіс курс і спробуйте викликати getAllCoursesByStudent
(використовуючи відповідний endpoint). Ви повинні отримати відповідь fallback.
Щасливого кодування!
Перекладено з: How to use circuit breaker pattern in spring boot