05.2 sentinel限流及熔断的原理

vvEcho 2025-02-28 16:43:22
Categories: Tags:

什么是Sentinel

Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性

sentinel如何实现限流 熔断 降级

  1. 定义限流资源
    通过 @SentinelResource 注解标记需要限流的接口,并指定限流处理逻辑
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    @RestController
    public class OrderController {

    // 定义限流资源(value需唯一)
    @GetMapping("/order/{id}")
    @SentinelResource(
    value = "orderDetail",
    blockHandler = "handleBlock", // 限流/熔断处理
    fallback = "businessErroHandleFallback" // 业务异常降级
    )
    public ResponseEntity<Order> getOrderDetail(@PathVariable Long id) {
    // 业务逻辑(模拟数据库查询)
    return ResponseEntity.ok(orderService.findById(id));
    }
    }
  2. 配置限流规则
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Configuration
    public class SentinelConfig {

    @PostConstruct
    public void initFlowRules() {
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule = new FlowRule("orderDetail");
    rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS模式
    rule.setCount(10); // 阈值:10次/秒
    rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP); // 冷启动
    rules.add(rule);
    FlowRuleManager.loadRules(rules);
    }
    }
  3. 熔断处理
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @PostConstruct
    public void initDegradeRules() {
    List<DegradeRule> degradeRules = new ArrayList<>();
    DegradeRule rule = new DegradeRule("orderDetail");
    rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO); // 异常比例模式
    rule.setCount(0.5); // 异常比例阈值50%
    rule.setTimeWindow(30); // 熔断时间窗口30秒
    rule.setMinRequestAmount(5); // 最小统计请求数
    degradeRules.add(rule);
    DegradeRuleManager.loadRules(degradeRules);
    }
  4. 业务异常降级,定义降级类
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class SentinelFallbackHandler {

    // 限流/熔断处理方法(需静态)
    public static ResponseEntity<Order> handleBlock(Long id, BlockException ex) {
    return ResponseEntity.status(503)
    .body(new Order(-1L, "服务繁忙,请稍后重试"));
    }

    // 业务异常降级处理(Throwable捕获)
    public static ResponseEntity<Order> businessErroHandleFallback(Long id, Throwable ex) {
    return ResponseEntity.status(500)
    .body(new Order(-1L, "服务异常:" + ex.getMessage()));
    }
    }

sentinel如何实现热点数据的限流

1
2
3
4
5
6
7
8
9
10
11
12
13
// 规则配置(控制台):
// 资源名:hotParam
// 参数索引:0(对应userId)
// 阈值:特定用户ID的QPS限制
@GetMapping("/hotParam")
@SentinelResource(
value = "hotParam",
blockHandler = "hotParamBlockHandler",
fallbackClass = SentinelFallbackHandler.class
)
public String hotParam(@RequestParam("userId") Long userId) {
return "用户ID:" + userId;
}

sentinel如何适配dubbo

Sentinel 提供了与 Dubbo 适配的模块 – Sentinel Dubbo Adapter,包括针对服务提供方的过滤器和服务消费方的过滤器。使用时用户只需引入相关模块,Dubbo的服务接口和方法(包括调用端和服务端)就会成为 Sentinel 中的资源,在配置了规则后就可以自动享受到 Sentinel 的防护能力。