Sentinel速览

警告
本文最后更新于 2024-05-09,文中内容可能已过时。

一、核心介绍 🔴

1、是什么?

Sentinel 是面向分布式、微服务架构的流量控制、熔断降级、系统自适应保护轻量级防护组件。

2、解决什么问题?

  • 解决高并发流量冲击,防止服务被打挂;

  • 解决服务调用雪崩、下游故障连环卡死;

  • 解决恶意刷接口、高频单点参数攻击;

  • 保障服务集群稳定性、容错性。

3、核心优势(对比Hystrix)

  • 轻量、低延迟、高性能;

  • 实时监控 + 可视化控制台;

  • 规则动态推送、实时生效;

  • 功能齐全:限流、熔断、热点、授权、系统保护;

  • Hystrix停止维护,Sentinel国内唯一主流。

二、三大核心基础概念 🔴

1、资源 Resource

Sentinel管控的最小单元,接口、方法、代码段都叫资源。

标记资源方式:@SentinelResource、URL接口、硬编码 SphU.entry()

2、规则 Rule

给资源配置的防护策略,五大规则:流量、熔断、热点、授权、系统。

3、Slot责任链(底层核心)

Sentinel底层采用责任链模式,一串Slot依次校验:

责任链顺序:统计簇点 -> 限流 -> 熔断 -> 热点 -> 系统防护

一句话:所有判断全部通过,才允许放行请求。

三、五大规则 🔴

1、流量控制规则 FlowRule(最常用)

1.1 限流阈值类型

  • QPS:每秒请求数(接口限流)

  • 并发线程数:同时活跃线程数(防止接口卡死、阻塞堆积)

1.2 流控模式(面试高频)

  1. 直接限流:对当前资源直接限制;

  2. 关联限流:关联接口流量大,限流当前接口(保护核心接口);

  3. 链路限流:只限制指定调用链入口,其他入口不拦截(精准限流)。

1.3 流控效果

  • 快速失败:超出阈值直接报错;

  • 预热排队:冷启动、缓慢抬升流量(秒杀防冲击);

  • 匀速排队:固定间隔放行,削峰填谷。

2、熔断降级规则 DegradeRule 🔴

2.1 三种熔断策略 🔴

  1. 慢调用比例:超时时间自定义,超过耗时的请求比例达到阈值,熔断;

  2. 异常比例:抛出异常请求占比超标,熔断;

  3. 异常数:单位时间异常次数达到阈值,熔断。

2.2 熔断三状态(面试必考)

  1. 关闭 Closed:正常通行;

  2. 打开 Open:直接拒绝,走降级;

  3. 半开 Half-Open:恢复时间到,放行少量请求探测,成功恢复、失败继续熔断。

3、热点参数限流 ParamFlowRule

针对请求参数限流,专门防:单点刷爆、热门商品、恶意用户。

示例:限制同一个userId 1秒最多访问5次。

4、授权规则 AuthorityRule

黑白名单,基于origin请求来源判定:

  • 白名单:仅允许指定微服务/IP访问;

  • 黑名单:直接拦截恶意IP、恶意服务。

5、系统规则 SystemRule

服务器全局层面保护,不针对接口:

  • CPU使用率、负载、全局QPS、最大线程、入口RT。

四、底层核心原理 🔴

1、滑动时间窗口

Sentinel 所有统计基于滑动时间窗口,而非固定窗口。

默认:1秒切分为2个窗口,每格500ms;

优点:避免临界流量突刺,统计平滑、精准,不会出现瞬间流量暴增。

2、底层数据结构

采用 CircularArray 环形数组 存储每秒请求数据,高性能、无锁、轻量化。

3、责任链Slot执行流程

  1. 进入资源;

  2. 簇点统计Slot(记录QPS、异常、耗时);

  3. 限流Slot判断;

  4. 熔断Slot判断;

  5. 热点、系统规则校验;

  6. 全部通过执行业务,失败直接抛异常。

五、注解使用 + 两种兜底区别 🟠

1、@SentinelResource 完整注解代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
@GetMapping("/order/get")
@SentinelResource(
        value = "orderGetResource",
        blockHandler = "blockHandler",   // 限流、拦截
        fallback = "fallbackHandler",     // 代码异常、熔断
        exceptionsToIgnore = {NullPointerException.class}
)
public String getOrder(){
    return "查询订单成功";
}

// 限流兜底:Sentinel规则拦截
public String blockHandler(BlockException e){
    return "请求过多,限流保护";
}

// 异常熔断兜底:业务报错、超时熔断
public String fallbackHandler(){
    return "服务暂时降级,请稍后重试";
}

2、两大兜底严格区别 🔴

  • blockHandler:只拦截Sentinel规则(限流、黑名单),不抓业务异常

  • fallback:拦截业务异常、超时、熔断,不处理单纯限流

六、Gateway整合Sentinel

1、使用位置

网关层做全局流量防护,所有微服务统一拦截。

2、支持限流方式

  • 路由维度限流;

  • URL路径限流;

  • IP黑名单限流;

  • 请求头、请求参数限流。

3、生产优势

入口拦截,不穿透到业务服务,性能最好、防护最强

七、持久化规则(生产必须配置)

默认控制台配置重启丢失,生产必须整合Nacos持久化

流程:控制台推送规则 -> Nacos存储 -> 服务监听动态拉取,永久保存。

八、生产常见坑点 🔴

  1. 没有兜底方法:直接返回报错页面,用户体验差;

  2. 限流熔断分不清:block和fallback乱用;

  3. 热点限流不生效:必须指定参数索引、基础阈值;

  4. 网关+服务双重限流:重复拦截,逻辑混乱;

  5. 未配置持久化:重启规则全部丢失;

  6. 线程数限流误用:IO阻塞接口适合线程数限流,普通接口用QPS。

九、Sentinel vs Hystrix 🔴

对比项 Sentinel Hystrix
维护状态 持续更新 停止维护
控制台 可视化、中文、监控详细 简陋、监控弱
限流能力 强大(QPS、热点、链路) 仅线程池隔离
熔断策略 3种策略 异常比例
性能 轻量、高性能 较重、线程池开销大

十、总结 🔴

Sentinel是阿里轻量级流量防护组件,底层采用责任链+滑动时间窗口做高性能统计;

包含流量限流、熔断降级、热点参数、授权黑白名单、系统保护五大规则;

限流分为QPS和线程数,流控模式有直接、关联、链路;

熔断包含慢调用、异常比例、异常数三种策略,存在关闭、打开、半开三种状态;

通过@SentinelResource标记资源,区分block限流兜底和fallback异常降级;

支持Nacos规则持久化,可整合Gateway做网关层限流,国内微服务目前主流首选。