什么是Sentinel
Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性
sentinel如何实现限流 熔断 降级
- 定义限流资源
通过 @SentinelResource 注解标记需要限流的接口,并指定限流处理逻辑1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class OrderController {
// 定义限流资源(value需唯一)
public ResponseEntity<Order> getOrderDetail( Long id) {
// 业务逻辑(模拟数据库查询)
return ResponseEntity.ok(orderService.findById(id));
}
} - 配置限流规则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class SentinelConfig {
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);
}
} - 熔断处理
1
2
3
4
5
6
7
8
9
10
11
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);
} - 业务异常降级,定义降级类
1
2
3
4
5
6
7
8
9
10
11
12
13
14public 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 | // 规则配置(控制台): |
sentinel如何适配dubbo
Sentinel 提供了与 Dubbo 适配的模块 – Sentinel Dubbo Adapter,包括针对服务提供方的过滤器和服务消费方的过滤器。使用时用户只需引入相关模块,Dubbo的服务接口和方法(包括调用端和服务端)就会成为 Sentinel 中的资源,在配置了规则后就可以自动享受到 Sentinel 的防护能力。