Sentinel:分布式系统的流量哨兵

一、基本概念

1. Sentinel定义

Sentinel是阿里巴巴开源的轻量级流量控制框架,专为分布式系统设计。它像一位尽职的哨兵,时刻守护着你的微服务架构,主要提供三大能力:

  • 流量控制:精确控制服务访问量,防止突发流量冲垮系统
  • 熔断降级:自动隔离故障服务,避免雪崩效应
  • 系统保护:智能调节系统负载,保障核心业务稳定运行

与Hystrix等传统熔断器相比,Sentinel的最大特点是"流量"为设计核心,提供了更丰富的控制维度和实时监控能力。

2. 核心目标

流量控制(Flow Control)

通过设定QPS或并发线程数阈值,防止服务被过量请求压垮。例如电商秒杀场景下,商品详情接口可限制为1000 QPS。

熔断降级(Circuit Breaking)

当服务异常比例达到阈值时,自动熔断并执行降级逻辑。比如支付服务异常率超过50%时,直接返回"系统繁忙"提示。

系统自适应保护

基于系统负载(CPU、RT等)动态调整流量,类似汽车的巡航系统。当CPU使用率超过80%时,自动拒绝非核心请求。

3. 关键术语

资源(Resource)

被保护的业务逻辑单元,通常对应一个接口或方法。例如:

@SentinelResource("getUserInfo")
public User getUserById(Long id) {...}

规则(Rule)

控制策略的载体,包含:

  • 流控规则(FlowRule)
  • 熔断规则(DegradeRule)
  • 系统保护规则(SystemRule)

槽位(Slot)

处理链中的功能节点,Sentinel通过责任链模式将不同功能解耦:

图1

实践建议:初次使用可先关注FlowSlot和DegradeSlot,掌握基础后再研究其他Slot的扩展能力。

二、核心功能点

1. 流量控制的三层防御

流控维度

  • QPS控制:适合API接口防护

    // 限制每秒不超过100次调用
    FlowRule rule = new FlowRule("apiA")
      .setCount(100)
      .setGrade(RuleConstant.FLOW_GRADE_QPS);
  • 并发线程数控制:适合耗时操作保护

    // 限制并发线程不超过50
    rule.setGrade(RuleConstant.FLOW_GRADE_THREAD);
    

流控效果

  • 快速失败:直接抛出BlockException(默认)
  • Warm Up:冷启动渐进式放量,适合突发流量场景

    rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)
      .setWarmUpPeriodSec(10); // 10秒预热期
  • 排队等待:以恒定间隔通过请求(漏桶算法)

    rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
      .setMaxQueueingTimeMs(500); // 最长等待500ms

2. 熔断降级的智能判断

Sentinel提供三种熔断策略:

策略类型触发条件适用场景
慢调用比例RT>阈值且比例超过设定值数据库查询等耗时操作
异常比例异常比例超过阈值外部服务调用
异常数异常数超过阈值需要快速熔断的场景

配置示例:

DegradeRule rule = new DegradeRule("serviceB")
    .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO)
    .setCount(0.5)  // 异常比例阈值50%
    .setTimeWindow(10); // 熔断时长10秒

实践建议:生产环境建议组合使用熔断策略,如先触发慢调用熔断,再结合异常比例熔断。

三、常规用法

1. 快速入门四步法

Step 1:添加依赖

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>

Step 2:定义资源

// 原生API方式
try (Entry entry = SphU.entry("queryOrder")) {
    return orderService.query(id);
} catch (BlockException e) {
    // 处理流控逻辑
    return "系统繁忙,请重试";
}

// 注解方式(推荐)
@SentinelResource(value = "queryOrder", blockHandler = "handleBlock")
public Order queryOrder(Long id) {...}

Step 3:配置规则

// 流控规则
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule("queryOrder")
    .setCount(100)
    .setGrade(RuleConstant.FLOW_GRADE_QPS);
FlowRuleManager.loadRules(rules);

// 熔断规则(通过DegradeRuleManager加载)

Step 4:查看监控
启动Sentinel Dashboard后,实时观测流量曲线和熔断状态:

图2

2. 生产级配置建议

  1. 规则持久化:避免重启失效

    // 对接Nacos配置中心
    ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = 
     new NacosDataSource<>(nacosServer, groupId, dataId, parser);
    FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
  2. Fallback设计:提供有意义的降级响应

    public String handleBlock(Long id, BlockException ex) {
     log.warn("触发限流,orderId={}", id);
     return "{\"code\":429,\"msg\":\"请求过于频繁\"}";
    }
  3. 黑白名单控制:使用AuthoritySlot实现

    AuthorityRule rule = new AuthorityRule();
    rule.setResource("adminApi");
    rule.setStrategy(RuleConstant.AUTHORITY_BLACK);
    rule.setLimitApp("192.168.1.100");

四、高级特性

1. 热点参数限流

针对高频访问的参数值单独限流,例如:

// 对不同的productId分别计数
ParamFlowRule rule = new ParamFlowRule("queryProduct")
    .setParamIdx(0)  // 参数索引位置
    .setCount(50);   // 单个值的QPS限制

// 特殊商品单独设置
ParamFlowItem item = new ParamFlowItem().setObject("product_123")
    .setCount(100);  // 爆款商品放宽限制
rule.setParamFlowItemList(Collections.singletonList(item));

2. 集群流控方案

分布式环境下统一计数,需部署Token Server:

图3

配置示例:

// Client端配置
ClusterFlowConfig config = new ClusterFlowConfig()
    .setFlowId(123L)
    .setThresholdType(1);
rule.setClusterConfig(config);

// Server端启动参数
-Dcsp.sentinel.server.port=8720
-Dcsp.sentinel.server.token.server.enable=true

五、常见问题排查

1. 规则不生效检查清单

  1. 资源名称是否完全匹配(区分大小写)
  2. 规则是否成功加载到对应的RuleManager
  3. 是否触发了其他优先规则(如系统保护规则)
  4. 通过curl http://localhost:8719/getRules?type=flow确认规则已生效

2. 性能优化建议

  • 减少资源埋点:核心路径外的代码不添加保护
  • 异步统计:对高QPS资源启用

    @SentinelResource(value = "highQpsApi", entryType = EntryType.OUT)
  • 关闭不用的Slot:通过-Dcsp.sentinel.slot.chain自定义

六、架构设计启示

Sentinel的优秀设计值得借鉴:

  1. 责任链模式:通过SlotChain实现功能解耦
  2. 统计与规则分离:StatisticSlot只负责统计,决策由后续Slot完成
  3. SPI扩展机制:方便二次开发
  4. 多级缓存设计:滑动窗口+LRU缓存提升性能

正如其名,Sentinel确实像一位忠诚的哨兵,为分布式系统筑起可靠防线。合理配置下,它能为系统带来显著的稳定性提升,建议从核心业务开始逐步应用。

评论已关闭