一句话总结
Sentinel 是阿里巴巴开源的流量治理组件,核心功能:流量控制(QPS/线程数限流)、熔断降级(慢调用比例/异常比例/异常数)、热点参数限流、系统自适应保护。相比 Hystrix:Sentinel 规则更灵活(控制台实时修改)、支持更多维度限流、资源消耗更低、社区更活跃。核心概念:资源(被保护的对象)、规则(限流/熔断策略)、Entry(资源访问入口)。
初级理解
Sentinel 基本使用
# 1. 引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
# 2. 配置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel 控制台地址
port: 8719 # 与控制台通信端口
# 3. 使用 @SentinelResource 注解
@RestController
public class UserController {
@GetMapping("/user/{id}")
@SentinelResource(value = "getUser", blockHandler = "getUserBlock")
public User getUser(@PathVariable Long id) {
return userService.getById(id);
}
// 限流/熔断后的降级方法
public User getUserBlock(Long id, BlockException e) {
return new User(-1L, "服务繁忙,请稍后重试");
}
}
中级深入
流量控制规则
# 流量控制模式
# 1. QPS 模式:每秒请求数超过阈值则限流
# 2. 线程数模式:并发线程数超过阈值则限流
# 流量控制效果
# 1. 快速失败:直接抛出 FlowException
# 2. Warm Up(预热):系统冷启动时缓慢增加阈值
# 默认 coldFactor=3,预热时长内阈值从 threshold/3 逐步升到 threshold
# 3. 排队等待:请求排队,匀速通过
# 适合处理突发流量(脉冲流量)
# 控制台配置示例
# 资源名:getUser
# 阈值类型:QPS
# 阈值:10(每秒最多 10 个请求)
# 流控模式:直接
# 流控效果:快速失败
熔断降级策略
| 策略 | 说明 | 示例 |
|---|---|---|
| 慢调用比例 | 响应时间超过阈值的请求比例 | RT > 200ms 的请求超过 50%,熔断 |
| 异常比例 | 异常请求占总请求的比例 | 异常比例超过 50%,熔断 |
| 异常数 | 异常请求的绝对数量 | 1 分钟内异常数超过 10,熔断 |
# 熔断状态机
# CLOSED(关闭)→ 正常状态,统计请求
# ↓ 达到熔断条件
# OPEN(打开)→ 拒绝所有请求,抛出 DegradeException
# ↓ 经过熔断时长
# HALF-OPEN(半开)→ 允许少量请求通过
# ↓ 请求成功 → CLOSED
# ↓ 请求失败 → OPEN
高级拓展
Sentinel vs Hystrix
| 对比维度 | Sentinel | Hystrix |
|---|---|---|
| 隔离策略 | 信号量隔离 | 线程池/信号量隔离 |
| 规则修改 | 控制台实时修改 | 需重启 |
| 限流维度 | QPS/线程数/热点/系统 | 线程池/信号量 |
| 控制台 | 功能完善 | 简单 Dashboard |
| 维护状态 | 活跃维护 | 停止维护 |
热点参数限流
# 热点参数限流:对某个参数值单独限流
# 场景:商品详情接口,热门商品限制更严格
@GetMapping("/product/{id}")
@SentinelResource(value = "getProduct", blockHandler = "blockHandler")
public Product getProduct(@PathVariable Long id) {
return productService.getById(id);
}
# 控制台配置
# 资源名:getProduct
# 参数索引:0(第 0 个参数,即 id)
# 阈值:100(默认 QPS 100)
# 热点参数:
# id=1001 → QPS 10(热门商品限制更严)
# id=1002 → QPS 20
实战场景
场景:Feign 整合 Sentinel
# 开启 Feign 对 Sentinel 的支持
feign:
sentinel:
enabled: true
# Feign 接口 + 降级实现
@FeignClient(name = "user-service", fallback = UserFeignFallback.class)
public interface UserFeignClient {
@GetMapping("/user/{id}")
User getUser(@PathVariable("id") Long id);
}
# 降级实现类
@Component
public class UserFeignFallback implements UserFeignClient {
@Override
public User getUser(Long id) {
return new User(-1L, "用户服务不可用");
}
}
# 或使用 fallbackFactory 获取异常信息
@FeignClient(name = "user-service", fallbackFactory = UserFeignFallbackFactory.class)
public interface UserFeignClient { }
面试模拟
面试官:Sentinel 和 Hystrix 有什么区别?
你:Sentinel 规则更灵活(控制台实时修改)、限流维度更多(QPS/线程数/热点/系统)、资源消耗更低。Hystrix 已停止维护,Sentinel 是当前主流选择。Sentinel 默认信号量隔离,Hystrix 默认线程池隔离。
面试官:Sentinel 的熔断策略有哪些?
你:三种:慢调用比例(响应时间超过阈值的比例)、异常比例(异常请求占比)、异常数(异常请求绝对数量)。熔断状态机:CLOSED → OPEN → HALF-OPEN → CLOSED/OPEN。