Sentinel 熔断降级
TIP
Sentinel 是阿里巴巴开源的流量控制和熔断降级组件,提供了实时监控、限流、熔断、系统负载保护等功能,比 Hystrix 更强大。
Sentinel 核心功能
| 功能 | 说明 |
|---|---|
| 流量控制 | 基于 QPS 或线程数的限流 |
| 熔断降级 | 基于响应时间、异常比例、异常数的熔断 |
| 系统保护 | 自适应保护系统负载 |
| 热点防护 | 对热点参数进行限流 |
| 实时监控 | 控制台查看实时流量数据 |
引入依赖
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>配置文件
yaml
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
eager: true # 立即注册(默认懒加载)
filter:
enabled: true
# 熔断规则配置
feign:
sentinel:
enabled: true资源定义
java
@RestController
public class OrderController {
// 方式一:注解方式(推荐)
@GetMapping("/order/{id}")
@SentinelResource(
value = "getOrder",
blockHandler = "getOrderBlockHandler", // 限流处理
fallback = "getOrderFallback" // 异常降级
)
public Order getOrder(@PathVariable Long id) {
if (id < 0) {
throw new IllegalArgumentException("id 不合法");
}
return orderService.getOrder(id);
}
// 限流处理(必须与原始方法参数一致,再加 BlockException)
public Order getOrderBlockHandler(Long id, BlockException e) {
return new Order(-1L, "请求太频繁,请稍后再试");
}
// 降级处理
public Order getOrderFallback(Long id, Throwable e) {
return new Order(-1L, "服务异常,请稍后在试");
}
}限流规则(代码配置)
java
@Configuration
public class SentinelConfig {
@PostConstruct
public void initRules() {
// 限流规则:QPS 阈值 10
List<FlowRule> flowRules = new ArrayList<>();
FlowRule flowRule = new FlowRule();
flowRule.setResource("getOrder");
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
flowRule.setCount(10);
flowRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
flowRules.add(flowRule);
FlowRuleManager.loadRules(flowRules);
// 熔断规则:慢调用比例 > 50% 则熔断
List<DegradeRule> degradeRules = new ArrayList<>();
DegradeRule degradeRule = new DegradeRule();
degradeRule.setResource("getOrder");
degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
degradeRule.setCount(100); // 响应时间 > 100ms
degradeRule.setTimeWindow(10); // 熔断时长 10秒
degradeRule.setMinRequestAmount(5); // 最小请求数
degradeRule.setSlowRatioThreshold(0.5); // 慢调用比例
degradeRules.add(degradeRule);
DegradeRuleManager.loadRules(degradeRules);
}
}Feign 整合 Sentinel
java
// 在 application.yml 中开启
// feign.sentinel.enabled: true
@FeignClient(name = "user-service", fallbackFactory = UserFallbackFactory.class)
public interface UserFeignClient {
@GetMapping("/user/{id}")
Result<User> getUser(@PathVariable("id") Long id);
}
@Component
public class UserFallbackFactory implements FallbackFactory<UserFeignClient> {
@Override
public UserFeignClient create(Throwable cause) {
return id -> Result.error("服务不可用: " + cause.getMessage());
}
}TIP
Sentinel 控制台提供了可视化的规则配置和监控面板,推荐在控制台中动态调整规则,避免修改代码重启。