1. Resilience4J 示例
Resilience4J 是一个轻量级的熔断库,支持 Spring Boot 项目中的熔断、重试、限流等功能。它通常通过配置文件和注解的方式来启用熔断功能。
示例:
// 使用 Resilience4J 提供的熔断器
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 配置熔断器名称
@CircuitBreaker(name = "userService", fallbackMethod = "fallback")
public String getUserInfo(String userId) {
// 模拟可能失败的业务逻辑
if (Math.random() < 0.5) {
throw new RuntimeException("Service failure");
}
return "User info for: " + userId;
}
// 熔断后的回退方法
public String fallback(String userId, Throwable t) {
return "Fallback: User service is down. Please try again later.";
}
}
配置: 在 application.yml
中可以配置 Resilience4J 的熔断器策略。
resilience4j.circuitbreaker:
instances:
userService:
registerHealthIndicator: true
failureRateThreshold: 50
slidingWindowSize: 10
waitDurationInOpenState: 10000ms
解释:
@CircuitBreaker
注解标记方法,启用熔断机制。fallbackMethod
指定在熔断后调用的回退方法。- 配置中的
failureRateThreshold
定义了失败率的阈值,slidingWindowSize
是熔断器的滑动窗口大小,waitDurationInOpenState
是当熔断器处于打开状态时等待的时间。
2. Sentinel 示例
Sentinel 是由阿里巴巴开发的,专门为分布式系统提供熔断、流量控制、降级等功能。它能够自动识别流量瓶颈,采取流量切断或限流措施。
示例:
首先,在 Spring Boot 项目中引入 Sentinel 的依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
然后,在服务中使用 Sentinel 提供的熔断功能:
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// 使用 Sentinel 提供的熔断器
@SentinelResource(value = "getUserInfo", fallback = "fallbackMethod")
public String getUserInfo(String userId) {
// 模拟可能失败的业务逻辑
if (Math.random() < 0.5) {
throw new RuntimeException("Service failure");
}
return "User info for: " + userId;
}
// 熔断后的回退方法
public String fallbackMethod(String userId) {
return "Fallback: User service is down. Please try again later.";
}
}
配置: 在 application.yml
中配置 Sentinel 参数。
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
datasource:
ds1:
driver-class-name: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/sentinel
username: root
password: root
解释:
@SentinelResource
注解用于指定熔断器资源和回退方法。- 配置中指定了 Sentinel 控制台的地址和数据源。
3. Spring Cloud Circuit Breaker 示例
Spring Cloud Circuit Breaker 是一个统一的熔断抽象,允许开发者选择不同的熔断器实现(如 Resilience4J、Hystrix、Sentinel 等)。
示例:
首先,依赖配置(以 Resilience4J 为例):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
然后,在服务中使用熔断器:
import org.springframework.cloud.client.circuitbreaker.CircuitBreaker;
import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final CircuitBreakerFactory circuitBreakerFactory;
public UserService(CircuitBreakerFactory circuitBreakerFactory) {
this.circuitBreakerFactory = circuitBreakerFactory;
}
public String getUserInfo(String userId) {
CircuitBreaker circuitBreaker = circuitBreakerFactory.create("userService");
return circuitBreaker.run(() -> {
// 模拟失败的业务逻辑
if (Math.random() < 0.5) {
throw new RuntimeException("Service failure");
}
return "User info for: " + userId;
}, throwable -> "Fallback: User service is down. Please try again later.");
}
}
解释:
CircuitBreakerFactory.create("userService")
用于创建一个名为userService
的熔断器。circuitBreaker.run()
方法执行正常的业务逻辑,若出现异常,则触发回退逻辑。
4. API Gateway (例如 Spring Cloud Gateway) 示例
Spring Cloud Gateway 是 Spring Cloud 提供的 API 网关,支持对流量进行控制,包括限流、熔断等。
示例:
首先,依赖配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
然后,配置熔断器(利用 Spring Cloud Gateway 的 Resilience4J
集成):
spring:
cloud:
gateway:
routes:
- id: user_service_route
uri: http://localhost:8081
predicates:
- Path=/user/**
filters:
- name: Resilience4J
args:
fallbackUri: "forward:/fallback"
resilience4j:
circuitbreaker:
instances:
userService:
registerHealthIndicator: true
failureRateThreshold: 50
slidingWindowSize: 10
waitDurationInOpenState: 10000ms
在 Controller
中定义回退方法:
@RestController
public class FallbackController {
@RequestMapping("/fallback")
public String fallback() {
return "Fallback: User service is down. Please try again later.";
}
}
解释:
- 在
application.yml
中配置了熔断器的阈值等参数。 - 使用 Spring Cloud Gateway 路由和过滤器配置来实现熔断,若服务不可用,则转到
/fallback
方法。
总结
框架 | 用途 | 示例 |
---|---|---|
Resilience4J | 提供熔断、重试、限流等容错功能 | 使用 @CircuitBreaker 注解定义熔断器,并提供回退方法。 |
Sentinel | 提供流量控制、熔断、降级等功能,支持高并发的分布式系统 | 使用 @SentinelResource 注解标记熔断资源,并提供回退方法。 |
Spring Cloud Circuit Breaker | 提供统一的熔断接口,支持不同实现(如 Resilience4J、Hystrix) | 使用 CircuitBreakerFactory 创建熔断器,并定义回退逻辑。 |
API Gateway | 用作微服务网关,支持熔断、限流等流量控制机制 | 在 Spring Cloud Gateway 中配置 Resilience4J 过滤器,设置熔断策略。 |