前言
上一篇我们讲解了 Sentinel 入门 ,从服务雪崩问题引入,完成了基础 API、注解方式接入 Sentinel。本文将从 Sentinel 控制台安装启动 开始,详细讲解 流控 / 热点 / 授权 / 系统 / 降级五大规则 、blockHandler 自定义兜底 、全局异常处理 、Feign 整合熔断 、Nacos 规则持久化,一站式掌握 Sentinel 生产级用法。
使用版本
- Spring Cloud Alibaba
- Sentinel 1.8.1
- Nacos 服务发现 / 配置中心
- Spring Boot / Spring Cloud OpenFeign
1. Sentinel 的安装和启动
Sentinel 提供轻量级控制台,支持实时监控、规则管理、接口链路查看,是开发与线上调试必备工具。
1.1 下载 Sentinel 控制台
官方下载地址:https://github.com/alibaba/Sentinel/releases

1.2 启动控制台
使用 java -jar 直接启动,默认端口 8080
java -jar sentinel-dashboard-1.8.1.jar
1.3 访问控制台
浏览器访问:http://localhost:8080
- 默认账号:sentinel
- 默认密码:sentinel


2. 微服务接入 Sentinel 控制台
2.1 引入 Starter 依赖
替换之前的 sentinel-core、sentinel-annotation-aspectj,直接使用官方启动器
XML
<!-- sentinel 启动器 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.2 配置控制台地址
application.yml
XML
spring:
cloud:
sentinel:
transport:
dashboard: 127.0.0.1:8080 # 控制台地址
2.3 编写测试接口
java
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@RequestMapping("/hello3")
public String hello3() {
return "Hello Sentinel3!!!";
}
}
2.4 测试接入效果
- 启动微服务,访问一次接口:http://127.0.0.1/consumer/getUserById/666
- 打开 Sentinel 控制台,即可看到服务与接口监控

- 在控制台直接新增流控规则 ,无需重启服务

- 高并发访问,触发限流

3. Sentinel 规则详解
Sentinel 规则分为五大类:流控规则、热点规则、授权规则、系统规则、降级规则。
3.1 流控规则
流控规则是最常用的规则,控制接口的访问速度,防止被上游压垮。
3.1.1 阈值类型
- QPS:每秒请求数达到阈值直接限流
- 线程数:当前接口并发线程数达到阈值限流
3.1.2 流控模式
- 直接:对当前接口直接限流
- 关联:关联资源达到阈值,限流自己(如订单 / 支付互相让步)
- 链路:只对指定入口链路限流(粒度更细)
3.1.3 流控效果
- 快速失败:直接拒绝,抛异常
- Warm Up:预热模式,初始阈值 = 最大阈值 / 3,慢慢爬升
- 排队等待:匀速通过,超时报错
QPS 限流示例

高并发访问触发限流:

Warm Up 预热示例

排队等待示例

3.2 热点规则
热点参数限流:对接口参数做细粒度限流,比如限制同一个商品 ID、同一个用户 ID 的访问频率。
3.2.1 接口添加注解
必须加 @SentinelResource 才生效
java
@RequestMapping("/getUserById/{id}")
@SentinelResource(value = "getUserById", blockHandler = "blockHandlerMethod")
public User getUserById(@PathVariable Integer id) {
return userFeign.getUserById(id);
}
// 兜底方法
public User blockHandlerMethod(Integer id, BlockException e){
return new User(id,"热点限流触发",0);
}
3.2.2 控制台配置热点规则

3.2.3 参数例外项
可对特定参数单独放宽阈值,如 ID=2 不限流

3.3 授权规则
根据调用来源控制放行 / 拦截,支持白名单 / 黑名单。
3.3.1 自定义来源解析器
java
@Component
public class RequestOriginParserDefinition implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
// 从请求参数获取来源标识
return request.getParameter("origin");
}
}
3.3.2 配置白名单 / 黑名单

3.4 系统规则
系统规则是应用级保护,对整个微服务所有接口统一限流,粒度较粗,慎用。
支持 5 种保护维度:
- LOAD(Linux)
- CPU 使用率
- 全局 RT
- 全局线程数
- 全局入口 QPS

3.5 降级规则(熔断)
当下游服务慢调用、异常比例、异常数超标时,暂时切断调用,防止级联故障。
3.5.1 三种降级策略
-
慢调用比例 :RT 超过阈值的请求占比超标
属性 说明 最大RT 需要设置的阈值,超过该值则为慢调用 比例阈值 慢调用占所有的调用的比率,范围:[0~1] 熔断时长 在这段时间内发生熔断、拒绝所有请求 最小请求数 即允许通过的最小请求数,在该数量内不发生熔断 -
异常比例 :请求异常占比超标
属性 说明 异常比例阈值 异常比例=发生异常的请求数÷请求总数取值范围:[0~1] 熔断时长 在这段时间内发生熔断、拒绝所有请求 最小请求数 即允许通过的最小请求数,在该数量内不发生熔断 -
异常数 :单位时间内异常次数超标
属性 说明 异常数 请求发生异常的数量 熔断时长 在这段时间内发生熔断、拒绝所有请求 最小请求数 即允许通过的最小请求数,在该数量内不发生熔断
服务熔断状态切换:

3.5.2 慢调用比例配置
1)新增熔断策略

2)控制请求时间
java
@RequestMapping(value = "/getUserById/{id}")
public User getUserById(@PathVariable Integer id) {
System.out.println("熔断降级效果:"+new Date());
//控制请求时间
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
return userFeign.getUserById(id);
}
3.5.3 异常比例配置
1)新增熔断策略

2)请求报异常
java
@RequestMapping(value = "/getUserById/{id}")
public User getUserById(@PathVariable Integer id) {
System.out.println("熔断降级效果:"+new Date());
//请求报异常
int a = 6/0;
return userFeign.getUserById(id);
}
3.5.4 异常数配置
1)新增熔断策略

2)请求报异常
java
@RequestMapping(value = "/getUserById/{id}")
public User getUserById(@PathVariable Integer id) {
System.out.println("熔断降级效果:"+new Date());
//请求报异常
int a = 6/0;
return userFeign.getUserById(id);
}
4. Sentinel 自定义兜底(blockHandler)
默认限流提示不友好,可通过 blockHandler 自定义返回。
4.1 同类内定义兜底
java
@SentinelResource(value = "getUserById", blockHandler = "blockHandlerMethod")
public User getUserById(@PathVariable Integer id) {
return userFeign.getUserById(id);
}
// 必须:返回值相同 + 参数相同 + 最后加 BlockException
public User blockHandlerMethod(Integer id, BlockException e) {
return new User(0, "接口被限流/熔断:" + e.getMessage(), 0);
}
4.2 外置类统一兜底
java
// 外置类
public class BlockHandlerClass {
public static User blockHandlerMethod(Integer id, BlockException e) {
return new User(0, "全局限流提示", 0);
}
}
// 注解使用
@SentinelResource(
value = "getUserById",
blockHandler = "blockHandlerMethod",
blockHandlerClass = BlockHandlerClass.class
)
5. Sentinel 全局异常处理
统一处理所有 BlockException,返回标准 JSON 格式。
5.1 实现 BlockExceptionHandler
java
@Component
public class GloabBlockExceptionHandler implements BlockExceptionHandler {
@Override
public void handle(HttpServletRequest request,
HttpServletResponse response,
BlockException e) throws Exception {
response.setContentType("application/json;charset=utf-8");
Result result = null;
if (e instanceof FlowException) {
result = Result.fail(-1, "接口限流");
} else if (e instanceof DegradeException) {
result = Result.fail(-2, "服务降级");
} else if (e instanceof ParamFlowException) {
result = Result.fail(-3, "热点参数限流");
} else if (e instanceof AuthorityException) {
result = Result.fail(-4, "授权校验失败");
} else if (e instanceof SystemBlockException) {
result = Result.fail(-5, "系统保护触发");
}
response.getWriter().write(JSON.toJSONString(result));
}
}
5.2 测试效果

6. Sentinel 整合 Feign(微服务调用熔断)
实际项目中通过 Feign 远程调用,必须在 Feign 层面实现熔断降级。
6.1 开启 Feign 对 Sentinel 支持
java
feign:
sentinel:
enabled: true # 开启整合
6.2 编写 FallbackFactory
java
@Component
public class UserFeignFallback implements FallbackFactory<UserFeign> {
@Override
public UserFeign create(Throwable throwable) {
return new UserFeign() {
@Override
public User getUserById(Integer id) {
return new User(id, "Feign 调用失败:" + throwable.getMessage(), 0);
}
};
}
}
6.3 Feign 接口指定降级
java
@FeignClient(
value = "sentinel-provider",
fallbackFactory = UserFeignFallback.class
)
public interface UserFeign {
@RequestMapping("/provider/getUserById/{id}")
User getUserById(@PathVariable("id") Integer id);
}
6.4 测试熔断
关闭服务提供者,访问接口:

7. Sentinel 规则持久化(Nacos)
Sentinel 默认规则内存存储,重启丢失,必须持久化到 Nacos。

7.1 引入持久化依赖
XML
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
7.2 配置 Nacos 数据源
XML
spring:
cloud:
sentinel:
datasource:
# 流控规则
flow:
nacos:
server-addr: 192.168.209.129:8848
namespace: sentinel
groupId: SENTINEL_GROUP
dataId: ${spring.application.name}-flow-rules
rule-type: flow
# 降级规则
degrade:
nacos:
server-addr: 192.168.209.129:8848
namespace: sentinel
groupId: SENTINEL_GROUP
dataId: ${spring.application.name}-degrade-rules
rule-type: degrade
7.3 改造 Sentinel Dashboard(推送到 Nacos)
- 下载源码修改
application.properties配置 Nacos 地址 - 重新打包
sentinel-dashboard.jar - 启动后在控制台添加规则自动同步 Nacos
7.4 Nacos 配置效果

总结
- Sentinel 控制台:安装启动 → 服务接入 → 实时监控
- 五大规则:流控、热点、授权、系统、降级,覆盖所有保护场景
- 兜底方案:blockHandler 局部 + 全局异常处理
- Feign 整合:微服务调用熔断必备
- Nacos 持久化:生产环境必须配置,防止规则丢失