一、Sentinel核心作用
Sentinel是阿里开源流量防护组件,面向微服务实现:流量限流、熔断降级、热点参数限流、系统自适应保护、授权规则、流量整形 。
核心优势:轻量、控制台可视化配置、原生整合SpringCloud Alibaba,完美适配Nacos,规则可持久化,不用硬编码写阈值。
两大组成部分:
- Sentinel Dashboard 控制台:独立Web服务,可视化配置规则、实时监控QPS、异常比例、阻塞线程;
- 客户端SDK:业务微服务集成依赖,自动埋点接口、Feign调用,执行流量控制逻辑。
二、Windows启动Sentinel控制台
1、下载
下载地址:下载地址
下载 sentinel-dashboard-x.x.x.jar
2、启动命令(默认端口8080)
cmd
java -jar sentinel-dashboard-1.8.8.jar
自定义端口:
cmd
java -jar sentinel-dashboard-1.8.8.jar --server.port=8090
3、访问后台
地址:http://127.0.0.1:8080
默认账号/密码:sentinel / sentinel
注意:Sentinel控制台只做规则配置展示,不持久化规则,默认客户端重启规则丢失,生产必须对接Nacos持久化。
三、微服务客户端接入
SpringBoot3 + SpringCloud Alibaba
1、Maven依赖
xml
<!-- Sentinel 流量防护 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、application.yml 配置
yaml
spring:
application:
name: order-service
cloud:
sentinel:
# Sentinel控制台地址
dashboard: 127.0.0.1:8080
# 客户端本地监控端口,默认8719,不可占用
transport:
port: 8719
3、关键特性:懒加载
Sentinel客户端默认第一次访问接口才会注册资源到控制台,启动后直接看控制台是空的,调用一次接口即可出现。
四、五大核心规则实操
控制台可视化配置,无需改代码
前置说明
资源名:默认就是接口请求路径,如/order/create。
规则1:流量限流(QPS限流)
场景:秒杀接口限制每秒最多10个请求,超过直接拒绝。
- 控制台 → 簇点链路 → 对应接口 → 流控;
- 阈值类型:QPS,单机阈值:10;
- 流控模式:单机;
- 流控效果:
- 快速失败:直接返回限流提示(默认);
- Warm Up:冷启动,缓慢放开流量(新服务上线防瞬间打满);
- 排队等待:匀速排队,控制间隔时间。
测试:JMeter压测,每秒超过10次请求,接口返回Blocked by Sentinel (flow limiting)。
规则2:熔断降级(异常熔断,防止雪崩)
下游服务超时/大量报错,直接熔断,不再发起远程调用,快速返回兜底结果。
支持3种降级策略:
- 慢调用比例:超过指定RT时长的请求占比超过阈值,熔断;
- 异常比例:异常请求占总请求比例超阈值,熔断;
- 异常数:单位时间内异常次数超阈值,熔断。
配置示例:异常比例阈值0.5,熔断时长10s。
熔断开启后,10s内所有请求直接走降级兜底逻辑,不调用远程接口。
规则3、热点参数限流
针对指定请求参数做精细化限流(比如单个用户频繁下单、单个商品疯狂抢购)。
例:入参goodsId,同一个商品ID每秒最多访问5次,不同商品互不干扰。
规则4、系统自适应保护
针对整个应用粒度保护,不限制单个接口:
- CPU使用率阈值;
- 平均RT、并发线程数、入口QPS等;
服务器负载过高时,直接拦截所有入口流量,保护应用不宕机。
规则5、授权规则(黑白名单)
根据调用方来源IP/origin标识:
- 白名单:仅指定IP可访问;
- 黑名单:指定IP直接拦截。
五、自定义限流/降级兜底返回
方式1:全局统一异常处理器
java
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class SentinelBlockHandler {
@ExceptionHandler(BlockException.class)
public String blockHandler(BlockException e) {
if (e instanceof FlowException) {
return "接口访问限流,请稍后重试";
} else if (e instanceof DegradeException) {
return "服务熔断降级,稍后重试";
}
return "访问被拦截";
}
}
方式2:@SentinelResource 注解自定义兜底
java
@GetMapping("/order/create")
@SentinelResource(value = "createOrder", blockHandler = "createOrderBlockHandler")
public String createOrder() {
// 正常业务逻辑
return "下单成功";
}
// 限流/降级兜底方法,参数、返回值和原方法一致
public String createOrderBlockHandler(BlockException ex) {
return "下单人数过多,稍后再试";
}
六、Feign远程调用自动熔断适配
Sentinel无缝整合OpenFeign,远程调用自动做熔断降级,开启配置:
yaml
feign:
sentinel:
enabled: true
编写Feign接口降级工厂,远程调用异常时返回固定兜底数据。
开启 Feign + Sentinel 熔断,会直接干扰 Seata AT 分布式事务,大概率造成事务无法正常回滚、数据一致性错乱,生产里二者不能简单同时开启,必须做隔离设计。
七、规则持久化到Nacos
生产必做,解决重启丢失规则
默认规则存在客户端内存,微服务重启规则全部清空,对接Nacos持久化规则,配置永久保存,控制台改动实时同步所有服务。
1、新增依赖
xml
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2、yml完整配置
yaml
spring:
cloud:
sentinel:
dashboard: 127.0.0.1:8080
transport:
port: 8719
# Nacos数据源持久化
datasource:
flow-rule:
nacos:
server-addr: 127.0.0.1:8848
data-id: ${spring.application.name}-flow-rules
group-id: DEFAULT_GROUP
rule-type: flow
配置后:
- Nacos后台新增对应data-id配置,JSON格式填写限流规则;
- 规则实时推送到客户端,服务重启不丢失;
- 支持多环境namespace隔离。
八、网关Gateway整合Sentinel限流
SpringCloud Gateway网关层做全局限流(入口流量拦截),无需每个微服务单独配置,支持路由维度、API分组限流。
九、和Resilience4j、Hystrix对比
- Hystrix:已停止维护,仅支持熔断降级,无控制台、无热点限流、系统保护;
- Resilience4j:Spring官方推荐,无原生可视化控制台;
- Sentinel:国产全套流量防护,可视化控制台、规则丰富、适配Alibaba微服务生态,国内生产主流。
十、高频踩坑
- 控制台看不到接口资源
Sentinel懒加载,必须调用一次接口才会注册;检查客户端8719端口未被占用; - 配置了限流规则不生效
核对资源名(接口路径)完全一致;确认客户端和控制台网络互通; - 重启微服务规则消失
没有接入Nacos持久化,内存规则重启清空; - Feign调用不触发熔断
yml开启feign.sentinel.enabled=true,未开启则不会拦截远程调用异常; - 限流异常不进入全局@ExceptionHandler
注解@SentinelResource单独指定了blockHandler,优先级高于全局异常处理器。