本文目录导读:

在 Java 中实现熔断降级,最主流的方案是使用 Sentinel 或 Resilience4j,Spring Cloud 生态中曾经的 Hystrix(已进入维护状态)也常被提及。
由于你询问的是“案例”,下面我分别给出使用 Sentinel(推荐) 和 Resilience4j 两个库的典型实现案例。
使用 Sentinel(阿里出品,功能强大,推荐生产使用)
Sentinel 支持控制台配置规则、实时监控,且对 Spring Cloud、Web、Dubbo 等框架有很好的适配。
引入依赖(Maven)
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2021.0.5.0</version> <!-- 版本根据Spring Cloud版本对应 -->
</dependency>
代码案例:通过 @SentinelResource 注解实现熔断降级
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
// value 指定资源名,用于配置规则
@SentinelResource(
value = "getOrder",
blockHandler = "handleBlock", // 发生熔断/限流/降级时调用的方法
fallback = "handleFallback" // 业务异常时调用的方法(如服务报错)
)
@GetMapping("/order")
public String getOrder() {
// 模拟一个可能出错的远程调用
if (System.currentTimeMillis() % 2 == 0) {
throw new RuntimeException("服务异常");
}
return "订单数据";
}
// blockHandler:返回给用户的降级提示(熔断/限流时)
public String handleBlock(BlockException ex) {
return "系统繁忙,请稍后再试(熔断降级)";
}
// fallback:处理业务异常
public String handleFallback(Throwable t) {
return "处理异常:" + t.getMessage();
}
}
配置熔断规则(通过代码或控制台)
方式A:硬编码规则(启动时加载)
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class SentinelConfig {
@PostConstruct
public void initDegradeRule() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule("getOrder") // 对应 @SentinelResource value
.setGrade(RuleConstant.DEGRADE_GRADE_RT) // 按响应时间降级
.setCount(500) // 响应时间 > 500ms 触发
.setTimeWindow(10); // 熔断后恢复时间10秒
// 或者按异常比例降级
// rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO);
// rule.setCount(0.5); // 异常比例 > 50%
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
}
方式B:推荐使用 Sentinel 控制台
启动时加 JVM 参数连接控制台:
-Dcsp.sentinel.dashboard.server=localhost:8080
在控制台可视化配置熔断规则(实时生效)。
使用 Resilience4j(轻量级,适合非 Spring Cloud 项目)
Resilience4j 提供 @CircuitBreaker 注解实现熔断,更轻量,功能模块化。
引入依赖(Maven)
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
配置熔断参数(application.yml)
resilience4j.circuitbreaker:
instances:
orderService: # 自定义熔断器名称
registerHealthIndicator: true
slidingWindowSize: 10 # 滑动窗口大小
minimumNumberOfCalls: 5 # 最少请求数
failureRateThreshold: 50 # 失败率 > 50% 触发熔断
waitDurationInOpenState: 10s # 熔断后等待10秒再尝试半开
permittedNumberOfCallsInHalfOpenState: 3
slidingWindowType: COUNT_BASED
代码案例
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
// name 对应配置文件中的熔断器实例名,fallbackMethod 指定降级方法
@CircuitBreaker(name = "orderService", fallbackMethod = "fallback")
@GetMapping("/order")
public String getOrder() {
// 模拟远程调用失败
if (Math.random() > 0.5) {
throw new RuntimeException("远程服务调用失败");
}
return "订单数据";
}
// 降级方法,必须与原方法返回类型一致,参数可多一个 Throwable
public String fallback(Exception e) {
return "服务熔断降级,返回默认数据";
}
}
核心原理对比与选择建议
| 特性 | Sentinel | Resilience4j |
|---|---|---|
| 熔断策略 | 响应时间、异常比例、异常数 | 基于滑动窗口的失败率 |
| 动态配置 | 控制台动态下发规则,无需重启 | 可通过 Actuator 端点或配置中心刷新 |
| 学习曲线 | 略高(规则概念多) | 较低,注解简洁明了 |
| 适合场景 | 大型分布式、微服务、高流量 | 轻量级、独立应用、需低侵入 |
特别提醒:如果你正在使用 Spring Cloud Gateway 或 Dubbo,强烈推荐 Sentinel,因为它对这些网关/RPC框架有原生支持,可做细粒度的流控和熔断降级。
不管是 Sentinel 还是 Resilience4j,核心套路都是一致的:
- 定义一个受保护的方法(通常是远程调用或耗时操作)。
- 通过注解或代码 标记该资源。
- 配置熔断规则(失败比例、响应时间阈值、熔断持续时间等)。
- 提供降级方法(fallback 或 blockHandler),当熔断触发时,直接返回降级结果,避免服务雪崩。
你可以根据自己的项目技术栈(使用的 Spring Cloud Alibaba 还是普通 Spring Boot)选择对应的方案,如果还有具体的报错或配置问题,欢迎继续追问。