Sentinel详细介绍
1. 核心功能
- 流量控制:通过QPS/线程数控制接口访问量
- 熔断降级:基于响应时间/异常比例/异常数进行服务熔断
- 系统保护:根据系统负载(CPU/平均RT/线程数)触发保护机制
- 实时监控:秒级数据统计展示
2. 使用流程
// 定义资源
@SentinelResource(value = "orderQuery", blockHandler = "handleBlock")
public List<Order> queryOrders() {
// 业务逻辑
}
// 配置规则
private static void initFlowRules() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule("orderQuery");
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
rule.setCount(10); // 每秒10次
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
3. 控制台部署
- 实时监控仪表盘
- 动态规则配置
- 机器健康状态检测
高频面试题与解析
Q1: Sentinel与Hystrix的主要区别?
答:
- 设计理念差异
- Hystrix:线程池隔离+熔断
- Sentinel:流量控制+熔断降级+系统保护
- 实时监控能力
- Sentinel提供秒级监控数据
- 规则配置方式
- Sentinel支持动态规则更新
- 扩展性
- Sentinel提供Filter/Processor扩展点
Q2: 熔断策略的三种模式?
答:
- 慢调用比例:
- 条件:响应时间 > 阈值 且 比例 > 设定值
- 公式: s l o w _ c o u n t t o t a l ≥ r a t i o \frac{slow\_count}{total} \geq ratio totalslow_count≥ratio
- 异常比例:
- 触发条件:异常比例超过阈值
- 异常数:
- 适用于低吞吐场景
Q3: 热点参数限流实现原理?
答:
- 参数索引标记
@SentinelResource(value = "hotResource", blockHandler = "handleHotBlock") public String getDetail(@RequestParam("id") String productId)
- 配置参数例外项
{ "paramIdx": 0, "paramValue": "P123", "threshold": 50 }
- 采用令牌桶算法进行细粒度控制
Q4: 规则持久化方案?
答:
- 文件持久化
- 使用FileRefreshableDataSource
- Nacos配置中心
- 监听Nacos配置变更
- ZooKeeper存储
- 利用节点监听机制
- Apollo集成
- 通过配置监听实现
Q5: 滑动窗口算法实现?
答:
- 时间窗口划分
- 将1秒划分为2个500ms窗口
- 数据统计结构
class Window { long startTime; AtomicLong pass = new AtomicLong(); AtomicLong block = new AtomicLong(); }
- 窗口滚动机制
- 当前时间戳: c u r r e n t = S y s t e m . c u r r e n t T i m e M i l l i s ( ) current = System.currentTimeMillis() current=System.currentTimeMillis()
- 窗口索引: i n d e x = ( c u r r e n t / 500 ) % 2 index = (current / 500) \% 2 index=(current/500)%2
- 统计合并策略
- 仅保留有效时间范围内的窗口数据
最佳实践建议
- 生产环境配置:
- 启用CLUSTER集群流量控制模式
- 配置合理的fallback降级策略
- 监控整合:
- 对接Prometheus监控体系
- 集成Grafana可视化面板
- 压测策略:
- 使用JMeter进行规则验证
- 监控规则触发时的系统指标变化