常见问题清单
1. 规则不生效
问题:配置了限流规则,但不生效。
排查:
# 1. 检查Dashboard连接
curl http://localhost:8719/api
# 2. 检查规则是否加载
curl http://localhost:8719/getRules?type=flow
# 3. 检查资源名是否一致
# Dashboard中的资源名 vs 代码中的资源名
解决:
// 确保资源名完全一致
@SentinelResource(value = "orderCreate") // 代码中
// Dashboard配置的资源名也必须是 "orderCreate"
// 检查规则加载
List<FlowRule> rules = FlowRuleManager.getRules();
System.out.println("规则数量:" + rules.size());
2. Dashboard看不到应用
问题:应用启动后,Dashboard看不到应用。
排查:
# 检查配置
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Dashboard地址
port: 8719 # 客户端端口
eager: true # 立即初始化
解决:
// 主动触发一次资源调用
@PostConstruct
public void init() {
try {
Entry entry = SphU.entry("sentinel-heartbeat");
entry.exit();
} catch (BlockException e) {
// ignore
}
}
3. 规则推送失败
问题:Dashboard推送规则失败。
排查:
# 检查网络连通性
telnet 192.168.1.100 8719
# 检查防火墙
iptables -L | grep 8719
解决:
# 开放8719端口
firewall-cmd --zone=public --add-port=8719/tcp --permanent
firewall-cmd --reload
4. 规则不持久化
问题:重启后规则丢失。
解决:
# 配置Nacos数据源
spring:
cloud:
sentinel:
datasource:
flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-flow-rules
groupId: SENTINEL_GROUP
rule-type: flow
5. 熔断器不恢复
问题:熔断器开启后不自动恢复。
排查:
// 检查熔断规则配置
DegradeRule rule = new DegradeRule();
rule.setTimeWindow(10); // 熔断时长10秒,确认是否配置
解决:
// 确保熔断时长合理
rule.setTimeWindow(10); // 10秒后自动恢复
// 检查探测请求是否成功
// 半开状态下,确保探测请求能成功
6. 限流不准确
问题:实际QPS超过限流阈值。
原因:
- 集群部署,每个实例独立限流
- 流量分布不均匀
解决:
// 方案1:使用集群流控
FlowRule rule = new FlowRule();
rule.setClusterMode(true);
// 方案2:降低单实例阈值
// 3个实例,总QPS 3000
// 每个实例配置 3000 / 3 = 1000
rule.setCount(1000);
7. 内存泄漏
问题:长时间运行后内存持续增长。
排查:
# 生成堆转储
jmap -dump:live,format=b,file=heap.bin <pid>
# 分析堆转储
jhat heap.bin
解决:
// 清理过期的统计数据
@Scheduled(fixedRate = 60000)
public void cleanUp() {
// Sentinel会自动清理,无需手动
}
// 限制资源数量
// 避免动态创建过多资源
8. CPU占用过高
问题:Sentinel导致CPU占用过高。
排查:
# 查看线程堆栈
jstack <pid> | grep -A 10 "Sentinel"
# 查看CPU占用
top -Hp <pid>
解决:
// 减少规则数量
// 调整滑动窗口大小
SampleCountProperty.setSampleCount(2);
// 禁用不必要的Slot
日志分析
开启Sentinel日志
logging:
level:
com.alibaba.csp.sentinel: DEBUG
# 日志文件位置
# ${user.home}/logs/csp/sentinel-*.log
关键日志
# 限流日志
[2025-01-21 10:00:00] WARN - Block request: resource=orderCreate, origin=default
# 熔断日志
[2025-01-21 10:00:00] WARN - Circuit breaker opened: resource=callProductService
# 规则加载日志
[2025-01-21 10:00:00] INFO - Flow rules loaded: 10 rules
性能诊断
JVM监控
# 查看GC情况
jstat -gcutil <pid> 1000
# 查看内存使用
jstat -gc <pid>
# 查看线程
jstat -threads <pid>
Arthas诊断
# 启动Arthas
java -jar arthas-boot.jar
# 查看热点方法
dashboard
# 追踪方法调用
trace com.alibaba.csp.sentinel.Entry entry
# 查看Sentinel统计
sc -d com.alibaba.csp.sentinel.*
监控告警
关键指标
# Prometheus告警规则
groups:
- name: sentinel
rules:
- alert: SentinelRuleLoadFailed
expr: sentinel_rule_load_failed > 0
annotations:
summary: "规则加载失败"
- alert: SentinelHighBlockRate
expr: rate(sentinel_block_qps[1m]) / rate(sentinel_pass_qps[1m]) > 0.2
annotations:
summary: "限流比例过高"
应急预案
紧急关闭Sentinel
// 方式1:禁用所有规则
FlowRuleManager.loadRules(new ArrayList<>());
DegradeRuleManager.loadRules(new ArrayList<>());
// 方式2:配置开关
@ConditionalOnProperty(name = "sentinel.enabled", havingValue = "true")
public class SentinelConfig { }
# application.yml
sentinel.enabled=false
降级方案
// 全局降级开关
@Component
public class GlobalFallback {
private volatile boolean degradeAll = false;
@Around("@annotation(sentinelResource)")
public Object around(ProceedingJoinPoint pjp) throws Throwable {
if (degradeAll) {
// 全局降级,直接返回
return null;
}
return pjp.proceed();
}
public void setDegradeAll(boolean degradeAll) {
this.degradeAll = degradeAll;
}
}
问题排查流程
发现问题
↓
1. 查看Dashboard监控
↓
2. 检查应用日志
↓
3. 检查规则配置
↓
4. 检查网络连通性
↓
5. 分析JVM状态
↓
6. 使用Arthas诊断
↓
定位根因
↓
制定解决方案
↓
验证修复效果
↓
总结文档
故障Case库
Case 1:限流过度
现象:大量请求被限流,实际QPS远低于阈值。
原因:时钟回拨导致统计异常。
解决:
# 同步时钟
ntpdate ntp.aliyun.com
# 配置自动同步
crontab -e
0 * * * * ntpdate ntp.aliyun.com
Case 2:Dashboard卡顿
现象:Dashboard页面卡顿,无响应。
原因:应用数量过多,Dashboard内存不足。
解决:
# 增加Dashboard内存
java -Xms2g -Xmx2g -jar sentinel-dashboard.jar
Case 3:规则丢失
现象:Dashboard配置的规则突然消失。
原因:未配置持久化,Dashboard重启导致。
解决:配置Nacos持久化(见第22篇)。
总结
故障排查要点:
- 日志分析:查看Sentinel日志定位问题
- 监控指标:关注QPS、限流率、熔断状态
- 规则检查:确认规则配置正确
- 网络诊断:检查Dashboard连通性
- 性能分析:使用JVM工具和Arthas
应急预案:
- 准备降级开关,紧急时关闭Sentinel
- 配置规则持久化,避免规则丢失
- 建立故障Case库,快速定位问题
- 定期演练应急流程
预防措施:
- 完善监控告警
- 定期巡检规则配置
- 压测验证限流效果
- 建立变更审批流程