Sentinel保姆级实操:控制台部署+限流熔断+Nacos持久化完整落地

一、Sentinel核心作用

Sentinel是阿里开源流量防护组件,面向微服务实现:流量限流、熔断降级、热点参数限流、系统自适应保护、授权规则、流量整形

核心优势:轻量、控制台可视化配置、原生整合SpringCloud Alibaba,完美适配Nacos,规则可持久化,不用硬编码写阈值。

两大组成部分:

  1. Sentinel Dashboard 控制台:独立Web服务,可视化配置规则、实时监控QPS、异常比例、阻塞线程;
  2. 客户端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个请求,超过直接拒绝。

  1. 控制台 → 簇点链路 → 对应接口 → 流控;
  2. 阈值类型:QPS,单机阈值:10;
  3. 流控模式:单机;
  4. 流控效果:
    • 快速失败:直接返回限流提示(默认);
    • Warm Up:冷启动,缓慢放开流量(新服务上线防瞬间打满);
    • 排队等待:匀速排队,控制间隔时间。

测试:JMeter压测,每秒超过10次请求,接口返回Blocked by Sentinel (flow limiting)

规则2:熔断降级(异常熔断,防止雪崩)

下游服务超时/大量报错,直接熔断,不再发起远程调用,快速返回兜底结果。

支持3种降级策略:

  1. 慢调用比例:超过指定RT时长的请求占比超过阈值,熔断;
  2. 异常比例:异常请求占总请求比例超阈值,熔断;
  3. 异常数:单位时间内异常次数超阈值,熔断。

配置示例:异常比例阈值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

配置后:

  1. Nacos后台新增对应data-id配置,JSON格式填写限流规则;
  2. 规则实时推送到客户端,服务重启不丢失;
  3. 支持多环境namespace隔离。

八、网关Gateway整合Sentinel限流

SpringCloud Gateway网关层做全局限流(入口流量拦截),无需每个微服务单独配置,支持路由维度、API分组限流。

九、和Resilience4j、Hystrix对比

  1. Hystrix:已停止维护,仅支持熔断降级,无控制台、无热点限流、系统保护;
  2. Resilience4j:Spring官方推荐,无原生可视化控制台;
  3. Sentinel:国产全套流量防护,可视化控制台、规则丰富、适配Alibaba微服务生态,国内生产主流。

十、高频踩坑

  1. 控制台看不到接口资源
    Sentinel懒加载,必须调用一次接口才会注册;检查客户端8719端口未被占用;
  2. 配置了限流规则不生效
    核对资源名(接口路径)完全一致;确认客户端和控制台网络互通;
  3. 重启微服务规则消失
    没有接入Nacos持久化,内存规则重启清空;
  4. Feign调用不触发熔断
    yml开启feign.sentinel.enabled=true,未开启则不会拦截远程调用异常;
  5. 限流异常不进入全局@ExceptionHandler
    注解@SentinelResource单独指定了blockHandler,优先级高于全局异常处理器。