Spring Boot 4 Microservices & REST APIs · Урок

Автоматические выключатели с Resilience4j

Применяйте шаблон автоматического выключателя с помощью Resilience4j, чтобы предотвращать каскадные сбои в микросервисах.

Урок 1 из 312 шагов

«Автоматические выключатели с Resilience4j» — бесплатный урок Spring Boot 4 Microservices & REST APIs на CoddyKit. Это урок 1 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Spring Boot 4 Microservices & REST APIs, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Spring Boot 4 Microservices & REST APIs содержит 3 уроков всего.

Части этого урока еще не переведены и отображаются на английском.

Building Resilient Microservices

Microservices are great, but they also bring new challenges. When one service fails, it shouldn't take down the whole system. This is where resilience comes in.

Building resilient systems means they can recover gracefully from failures and continue to function, even if in a degraded mode. It's crucial for maintaining service availability and user experience.

Avoiding Cascading Failures

Imagine a chain of services: Service A calls B, which calls C. If Service C becomes slow or unresponsive, Service B will wait, consuming resources. Then Service A will wait for B, and so on.

Eventually, all services in the chain might exhaust their resources (like threads or connections) and fail, leading to a complete system outage. This is a cascading failure, a common problem in distributed systems.

The Circuit Breaker Pattern

The circuit breaker pattern helps prevent cascading failures. It's like an electrical circuit breaker in your house: if there's an overload, it 'trips' and cuts off the power to prevent damage.

In software, a circuit breaker wraps a function call to a potentially failing service. If calls to that service repeatedly fail, the circuit breaker 'opens,' preventing further calls to the failing service and returning an error immediately.

Resilience4j: Our Tool

Resilience4j is a lightweight, easy-to-use fault-tolerance library for Java and Kotlin. It provides several patterns to make your applications more resilient, including:

  • Circuit Breaker: Prevents repeated calls to failing services.
  • Retry: Automatically retries failed operations.
  • Rate Limiter: Controls the rate of requests to a service.

In this lesson, we'll focus specifically on the Circuit Breaker pattern.

Setup: Adding Dependency

First, let's add the necessary dependency to our Spring Boot project. For Maven, you'd add this to your pom.xml:

<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>2.2.0</version> <!-- Use latest stable -->
</dependency>

This dependency brings in the core Resilience4j modules and its Spring Boot integration for easy configuration.

Configuring Circuit Breaker

We can configure circuit breakers in our application.yml or application.properties. Here's a basic example for a service named 'myExternalService':

resilience4j.circuitbreaker:
instances:
myExternalService:
failureRateThreshold: 50
waitDurationInOpenState: 5s
slidingWindowType: COUNT_BASED
slidingWindowSize: 10

  • failureRateThreshold: If 50% of calls fail, the circuit opens.
  • waitDurationInOpenState: How long the circuit stays open (5 seconds).
  • slidingWindowType & slidingWindowSize: Metrics are collected over the last 10 calls.

Implementing Circuit Breaker

Now, let's protect a service call using the @CircuitBreaker annotation. This tells Spring to apply the configured circuit breaker named "myExternalService" to this method.

Try running this example. If callExternalService() throws an exception frequently (simulated here), the circuit will eventually open and reject calls immediately.

package com.coddykit.resilience;

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@SpringBootApplication
@RestController
public class CircuitBreakerDemoApplication {

    private Random random = new Random();

    public static void main(String[] args) {
        SpringApplication.run(CircuitBreakerDemoApplication.class, args);
    }

    @GetMapping("/call-external")
    @CircuitBreaker(name = "myExternalService")
    public String callExternalService() {
        System.out.println("Attempting external service call...");
        if (random.nextBoolean()) { // Simulate 50% failure rate
            System.out.println("External service failed!");
            throw new RuntimeException("External Service Unavailable!");
        }
        System.out.println("External service call successful!");
        return "External Service Data";
    }
}

Circuit Breaker States

A circuit breaker operates in three main states:

  • CLOSED: Normal operation. Calls go through. If failures exceed a threshold, it transitions to OPEN.
  • OPEN: Calls are immediately rejected with an error. After a waitDurationInOpenState, it transitions to HALF_OPEN.
  • HALF_OPEN: A limited number of test calls are allowed through. If these succeed, it transitions back to CLOSED. If they fail, it returns to OPEN.

This cycle prevents overwhelming a struggling service while allowing it to recover.

Graceful Fallbacks

When a circuit breaker is OPEN, or if a call fails for other reasons, we don't want to just return a generic error. We can provide a fallback method to return a default response or perform alternative logic.

Resilience4j's @CircuitBreaker annotation allows you to specify a fallback method that will be called if the primary method fails or the circuit is open. This ensures a more graceful degradation of service.

Circuit Breaker with Fallback

Let's enhance our previous example with a fallback method. When the circuit is open or callExternalService() fails, fallbackMethod() will be executed instead.

Run this and try to trigger the circuit breaker. Notice how the fallback message is returned when the external service fails or the circuit is open, providing a better user experience.

package com.coddykit.resilience;

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@SpringBootApplication
@RestController
public class CircuitBreakerWithFallbackApplication {

    private Random random = new Random();

    public static void main(String[] args) {
        SpringApplication.run(CircuitBreakerWithFallbackApplication.class, args);
    }

    @GetMapping("/call-external-with-fallback")
    @CircuitBreaker(name = "myExternalService", fallbackMethod = "fallbackMethod")
    public String callExternalService() {
        System.out.println("Attempting external service call...");
        if (random.nextBoolean()) { // Simulate 50% failure rate
            System.out.println("External service failed!");
            throw new RuntimeException("External Service Unavailable!");
        }
        System.out.println("External service call successful!");
        return "External Service Data";
    }

    // The fallback method must have the same return type and can accept a Throwable parameter
    public String fallbackMethod(Throwable t) {
        System.out.println("Fallback method called: " + t.getMessage());
        return "Fallback: Default Data (Service Currently Unavailable)";
    }
}

Circuit Breaker Check

Consider a circuit breaker configured with failureRateThreshold: 70 and slidingWindowSize: 10. If 8 out of the last 10 consecutive calls fail while the circuit is CLOSED, what is the most likely immediate next state of the circuit breaker?

Recap: Circuit Breakers

We've learned how circuit breakers, especially with Resilience4j, are vital for building resilient microservices. They prevent cascading failures by stopping repeated calls to failing services.

Key takeaways:

  • Circuit breakers protect services from overload and unresponsiveness.
  • They operate in CLOSED, OPEN, and HALF_OPEN states.
  • Fallbacks provide graceful degradation when a service is unavailable.

Next, we'll explore other resilience patterns like implementing fallbacks and timeouts more deeply.

Можно начать бесплатно

Изучай Java с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
24
Уроки
93

Часто задаваемые вопросы

Урок «Автоматические выключатели с Resilience4j» бесплатный?

Да — полный текст урока «Автоматические выключатели с Resilience4j» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Spring Boot 4 Microservices & REST APIs, подпишись на CoddyKit PRO. Курс Spring Boot 4 Microservices & REST APIs содержит 3 уроков всего.

Чему я научусь в уроке «Автоматические выключатели с Resilience4j»?

Применяйте шаблон автоматического выключателя с помощью Resilience4j, чтобы предотвращать каскадные сбои в микросервисах. Ты практикуешь Spring Boot 4 Microservices & REST APIs с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Spring Boot 4 Microservices & REST APIs?

Предыдущий опыт не требуется. Spring Boot 4 Microservices & REST APIs на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 3.

Сколько времени занимает урок «Автоматические выключатели с Resilience4j»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Spring Boot 4 Microservices & REST APIs?

Да. Каждый урок Spring Boot 4 Microservices & REST APIs включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Автоматические выключатели с Resilience4j
  2. Реализация резервных вариантов и тайм-аутов
  3. Распределённая трассировка с Zipkin
← Назад к Spring Boot 4 Microservices & REST APIs