Sentinel
简介
Sentinel 是阿里巴巴开源的面向分布式服务架构的流量控制组件,以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保障服务稳定性。
核心概念
- 资源:被保护的方法、接口或其他代码
- 规则:定义如何保护资源的策略
- Slot Chain:规则处理的责任链模式
流量控制
基本用法
java
// 定义资源
try (Entry entry = SphU.entry("HelloWorld")) {
// 被保护的逻辑
System.out.println("处理请求");
} catch (BlockException e) {
// 被限流时的处理
System.out.println("请求被限流");
}规则配置
java
private static void initFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("HelloWorld");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // QPS 限流
rule.setCount(20); // 阈值:20 QPS
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}熔断降级
熔断规则
java
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("RemoteService");
rule.setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType()); // 异常比例
rule.setCount(0.5); // 50% 异常率触发熔断
rule.setTimeWindow(10); // 熔断后恢复时间(秒)
rules.add(rule);
DegradeRuleManager.loadRules(rules);熔断器三种状态
| 状态 | 说明 |
|---|---|
| CLOSED | 正常状态 |
| OPEN | 熔断状态,请求直接失败 |
| HALF_OPEN | 半开状态,允许部分请求探测恢复 |
热点参数限流
java
ParamFlowRule rule = new ParamFlowRule("getUserById")
.setParamIdx(0) // 对第一个参数限流
.setCount(100); // 阈值 100
ParamFlowRuleManager.loadRules(Collections.singletonList(rule));
// 特殊参数单独配置
ParamFlowItem item = new ParamFlowItem()
.setObject("userId_1")
.setClassType(String.class.getName())
.setCount(50);
rule.setParamFlowItemList(Collections.singletonList(item));Spring Cloud 集成
java
@RestController
public class TestController {
@GetMapping("/hello")
@SentinelResource(value = "hello",
blockHandler = "handleBlock",
fallback = "handleFallback")
public String hello(@RequestParam String name) {
return "Hello, " + name;
}
public String handleBlock(String name, BlockException e) {
return "请求太频繁,请稍后再试";
}
public String handleFallback(String name, Throwable e) {
return "服务异常,已降级处理";
}
}控制台
Sentinel 提供 Web 控制台,支持实时监控、规则推送和机器列表管理。可通过 java -jar sentinel-dashboard.jar 启动,配置 -Dcsp.sentinel.dashboard.server=localhost:8080 接入。