Skip to content

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 接入。