使用 Resilience4j 实现熔断器
集成 Resilience4j 实现熔断器模式,防止微服务中的故障级联。
使用 Resilience4j 实现熔断器 是 CoddyKit 上的免费 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程共包含 4 节课。
本课时的部分内容尚未翻译,以英文显示。
Microservices & Resilience
In a microservices architecture, many small services work together. While powerful, this interconnectedness can be a weakness.
If one service becomes slow or unresponsive, requests can pile up, leading to other services waiting, which then slows them down too. This is called a cascading failure and can bring down your entire system!
What's a Circuit Breaker?
Think of an electrical circuit breaker in your home. If there's an overload, it 'trips' to prevent damage.
In software, a Circuit Breaker pattern does the same. It stops continuous calls to a failing service, giving that service time to recover and preventing the failure from spreading.
Instead of hammering a broken service, the circuit breaker 'fails fast' by immediately returning an error or a fallback response.
Introducing Resilience4j
Resilience4j is a lightweight, fault-tolerance library inspired by Netflix Hystrix. It's designed for functional programming and integrates seamlessly with Spring Boot.
It provides various resilience patterns, including Circuit Breaker, Rate Limiter, Retry, and Bulkhead, helping you build more robust microservices.
The Three States of a Circuit
A Circuit Breaker operates in three main states:
- CLOSED: This is the normal state. Requests pass through to the protected service. If failures exceed a configured threshold, it transitions to OPEN.
- OPEN: No requests are allowed through. All calls fail immediately. After a configured wait duration, it transitions to HALF_OPEN.
- HALF_OPEN: A limited number of test requests are allowed. If these succeed, the circuit CLOSEs. If they fail, it re-OPENs.
Setting Up Resilience4j
To use Resilience4j with Spring Boot, you need to add the necessary dependencies to your pom.xml (for Maven) or build.gradle (for Gradle).
These dependencies provide the core Circuit Breaker functionality and Spring Boot integration.
<!-- Maven (pom.xml) -->
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-circuitbreaker</artifactId>
<version>1.7.1</version>
</dependency>Basic Circuit Breaker Config
You configure Circuit Breakers in your application.yml or application.properties. Here's a basic example:
failureRateThreshold:Percentage of failures to open the circuit.waitDurationInOpenState:How long the circuit stays open.slidingWindowSize:Number of calls to consider for failure rate.
resilience4j.circuitbreaker:
instances:
myBackendService:
failureRateThreshold: 50
waitDurationInOpenState: 5s
slidingWindowType: COUNT_BASED
slidingWindowSize: 10Protecting a Service Call
With Spring Boot, you can easily apply a Circuit Breaker using the @CircuitBreaker annotation on the method you want to protect.
Specify the name of your configured circuit breaker instance and an optional fallbackMethod.
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
@Service
public class MyExternalService {
@CircuitBreaker(name = "myBackendService", fallbackMethod = "reliableFallback")
public String callReliableApi() {
// Simulate an API call that might fail
if (Math.random() < 0.7) {
throw new RuntimeException("API call failed!");
}
return "Data from API";
}
public String reliableFallback(Throwable t) {
return "Fallback: Service is currently unavailable.";
}
}Hands-on with Resilience4j
Let's see a Circuit Breaker in action! This runnable example simulates calls to a service that frequently fails, demonstrating the state transitions.
Observe how the circuit opens after several failures and then tries to half-open after a delay.
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.vavr.CheckedFunction0;
import java.time.Duration;
public class Main {
public static void main(String[] args) {
CircuitBreakerConfig config = CircuitBreakerConfig.custom()
.failureRateThreshold(50) // 50% failure rate to open
.waitDurationInOpenState(Duration.ofSeconds(2))
.slidingWindowSize(10)
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED)
.build();
CircuitBreaker circuitBreaker = CircuitBreaker.of("myTestService", config);
circuitBreaker.getEventPublisher()
.onStateTransition(event -> System.out.println("\nCircuit Breaker State Transition: " + event.getOldState() + " -> " + event.getNewState() + "\n"));
System.out.println("Simulating 20 service calls...");
for (int i = 1; i <= 20; i++) {
try {
String result = circuitBreaker.executeCheckedSupplier(
(CheckedFunction0<String>) () -> {
if (Math.random() < 0.6) { // Simulate 60% failure
System.out.println(" Call " + i + ": Service failed!");
throw new RuntimeException("Simulated Service Error");
}
System.out.println(" Call " + i + ": Service succeeded.");
return "Data from Service";
});
System.out.println(" -> Result: " + result);
} catch (Throwable t) {
System.out.println(" -> Result: Fallback/Circuit OPEN! Message: " + t.getMessage());
}
try {
Thread.sleep(200); // Pause to observe behavior
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
System.out.println("\nSimulation complete. Final state: " + circuitBreaker.getState());
}
}Handling Fallbacks Gracefully
The fallbackMethod is crucial. When the protected method fails (either due to an exception or the circuit being OPEN), this method is invoked instead.
It allows you to provide a default response, cached data, or a simplified experience to the user, preventing a complete failure of the user's request.
Always ensure your fallback method has the same return type and accepts a Throwable as its last argument.
Key Configuration Parameters
Understanding these parameters helps you fine-tune your Circuit Breaker:
failureRateThreshold:The percentage of failures that will cause the circuit to open.waitDurationInOpenState:The duration the circuit will stay in the OPEN state before transitioning to HALF_OPEN.slidingWindowSize:The number of calls that are recorded and used to calculate the failure rate.slidingWindowType:Can beCOUNT_BASED(a fixed number of calls) orTIME_BASED(calls within a certain time window).
Quick Check: Circuit States
Which of the following conditions might cause a Circuit Breaker to transition from CLOSED to OPEN state in Resilience4j?
Recap: Guarding Your Services
You've learned that Circuit Breakers are an essential pattern for building resilient microservices. They prevent cascading failures by 'tripping' when a service is unhealthy, giving it time to recover.
Resilience4j provides a lightweight and powerful way to implement these patterns in your Spring Cloud Gateway or Spring Boot applications. You now understand its states, basic configuration, and how to apply it to protect your services.
常见问题解答
「使用 Resilience4j 实现熔断器」课时是免费的吗?
是的 — 「使用 Resilience4j 实现熔断器」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程的其余内容,请升级到 CoddyKit PRO。 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程共包含 4 节课。
「使用 Resilience4j 实现熔断器」这节课中我会学到什么?
集成 Resilience4j 实现熔断器模式,防止微服务中的故障级联。 你通过在浏览器中直接运行的动手代码来练习 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway),全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 需要有经验吗?
无需任何先前经验。CoddyKit 上的 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「使用 Resilience4j 实现熔断器」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课中编写并运行代码吗?
能。每节 API Gateway & Reverse Proxy (Nginx + Spring Cloud Gateway) 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 使用 Resilience4j 实现熔断器
- 重试与超时配置
- 错误处理与降级方案
- 隔离舱与限流:提升恢复能力