Sentinel:高可用流量控制与熔断降级
文章目录
Sentinel:高可用流量控制与熔断降级
第一章:Sentinel 是什么?
第二章:流量控制——像地铁早高峰限流
场景还原:
Sentinel 解决方案:
第三章:熔断降级——电路保险丝的启发
场景还原:
Sentinel 熔断策略:
第四章:Sentinel 控制台——实时监控仪表盘
第五章:为什么不用 Hystrix?
第六章:常见问题排坑
第七章:总结与预告
第一章:Sentinel 是什么?
想象你开了一家网红奶茶店,突然被美食博主推荐,门口排起百米长队。如果不控制人流,店员累瘫、机器过热、订单混乱,整个系统直接崩溃。Sentinel 就是这家奶茶店的“智能店长”,它做了两件事:
流量控制:每分钟只放 50 人进店,避免挤爆收银台。
熔断降级:发现珍珠煮糊了,立刻关闭珍珠奶茶选项,推荐其他饮品。
在技术领域,Sentinel 是阿里巴巴开源的流量治理组件,专门防止微服务被突发流量打垮。
第二章:流量控制——像地铁早高峰限流
场景还原:
用户服务提供一个查询接口,正常能承受 1000 次/秒的请求。突然有 5000 人同时访问,服务器 CPU 飙到 99%——就像地铁站涌入大量乘客,闸机口挤成乱麻。
Sentinel 解决方案:
设置 QPS 阈值:每秒最多允许 800 次请求,超出的排队等待。
设置并发线程数:最多 20 个线程同时处理,超出直接拒绝。
代码示例:用 Sentinel 保护接口
// 用户查询接口:用 Sentinel 做流量控制
@RestController
@RequestMapping("/user")
public class UserController {
// 定义资源名称(像给奶茶店取个编号)
private static final String RESOURCE_NAME = "getUserInfo";
// 初始化规则:开业前先定好规矩
@PostConstruct
public void initRule() {
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource(RESOURCE_NAME);
rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 按 QPS 限流
rule.setCount(800); // 每秒最多 800 次
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
// 添加 @SentinelResource 注解,标记受保护的资源
@GetMapping("/{id}")
@SentinelResource(value = RESOURCE_NAME, blockHandler = "handleBlock")
public String getUser(@PathVariable Long id) {
return "查询用户" + id + "成功:张三,会员等级 V3";
}
// 被限流时的处理逻辑(像告诉顾客“请稍后再来”)
public String handleBlock(Long id, BlockException ex) {
return "客官稍等,当前排队人数过多,请喝杯茶再试!";
}
}
第三章:熔断降级——电路保险丝的启发
场景还原:
订单服务调用支付服务时,如果支付服务响应缓慢,大量线程被卡住,最终导致订单服务崩溃——就像电路过载时保险丝熔断,避免引发火灾。
Sentinel 熔断策略:
慢调用比例:如果 50% 的请求响应时间超过 1 秒,触发熔断。
异常比例:如果 60% 的请求抛出异常,触发熔断。
代码示例:支付服务熔断保护
// 支付服务调用:用 Sentinel 实现熔断
@Service
public class PaymentService {
// 定义资源名称
private static final String PAYMENT_RESOURCE = "callPayment";
@PostConstruct
public void initRule() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource(PAYMENT_RESOURCE);
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO); // 按异常比例熔断
rule.setCount(0.6); // 异常比例阈值 60%
rule.setTimeWindow(10); // 熔断持续时间 10 秒
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
// 调用支付服务(模拟可能失败的操作)
@SentinelResource(value = PAYMENT_RESOURCE, fallback = "paymentFallback")
public String callPayment(Long orderId) {
// 随机抛出异常模拟故障
if (Math.random() > 0.5) {
throw new RuntimeException("支付服务连接超时");
}
return "订单" + orderId + "支付成功";
}
// 熔断后的降级处理(像挂出“暂停服务”牌子)
public String paymentFallback(Long orderId, Throwable ex) {
return "支付系统繁忙,请稍后重试订单" + orderId;
}
}
第四章:Sentinel 控制台——实时监控仪表盘
Sentinel 提供了一个可视化控制台(就像奶茶店的监控大屏),可以:
实时查看流量:每个接口的 QPS、响应时间、异常数。
动态调整规则:不用改代码就能修改限流阈值。
查看调用链路:追踪请求经过了哪些服务。
启动控制台步骤:
下载 Sentinel 控制台 jar 包。
执行命令 java -Dserver.port=8080 -jar sentinel-dashboard.jar。
访问 http://localhost:8080,默认账号密码 sentinel/sentinel。
第五章:为什么不用 Hystrix?
Hystrix 是 Netflix 的熔断组件,但已停止更新。Sentinel 的优势更明显:
更丰富的流量控制:支持 QPS、线程数、热点参数限流。
实时监控可视化:Hystrix 需要结合 Turbine 才能看聚合数据。
动态规则推送:规则可以保存在 Nacos 中,修改后自动生效。
用 Hystrix 就像手动操作电闸,而 Sentinel 是全自动智能配电箱。
第六章:常见问题排坑
问题 1:规则不生效
检查 @SentinelResource 注解是否遗漏。
确认控制台是否成功连接到应用。
问题 2:熔断后无法恢复
检查 timeWindow 参数是否设置过久。
查看服务提供方是否真的恢复健康。
第七章:总结与预告
Sentinel 就像微服务系统的“急救医生”,在流量洪峰和依赖故障时保护系统生命线。下一篇文章我们会用 RocketMQ 实现服务间通信——就像在奶茶店和后厨之间安装自动传送带,订单和制作流程完全解耦。
如果你经历过系统被流量打挂的绝望,Sentinel 就是那道让你安心的保险杠。技术世界里,预防永远比抢救更重要。




















暂无评论内容