Skip to content

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 控制台提供了可视化的规则配置和监控面板,推荐在控制台中动态调整规则,避免修改代码重启。