Sentinel:高可用流量控制与熔断降级

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 就是那道让你安心的保险杠。技术世界里,预防永远比抢救更重要。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容