三个概念,一套组合拳,守住系统的最后一道防线。
凌晨两点,某电商平台周年庆活动刚开启十分钟。运营在群里欢呼的同时,技术群里却是另一番景象——监控大屏上,支付服务的错误率从0.5%直线飙升到45%,订单服务的线程池迅速被占满,紧接着库存服务也开始超时。不到二十分钟,整个交易链路全线崩溃。
事后复盘发现,罪魁祸首是下游的风控服务在大流量下响应变慢,导致上游服务大量请求阻塞等待,线程资源耗尽后级联扩散——这就是典型的服务雪崩。
雪崩的根源在于:大量同步请求等待造成的资源耗尽。而解决雪崩问题,靠的不是某一个单点措施,而是一套完整的稳定性保障组合拳——限流、熔断与降级。
一、限流:守住入口,挡住扛不住的流量
限流解决的是"量"的问题。它的核心逻辑很简单:设定一个阈值,超过这个阈值的请求直接拒绝,不让流量冲垮系统。
常见的限流策略有两种:按QPS限流和按并发线程数限流。比如某核心接口日常QPS稳定在500左右,压测表明单机极限是800,那限流阈值就可以设置在700左右——留一点余量,但不浪费资源。
在Spring Cloud生态中,Sentinel是目前最主流的限流工具。通过@SentinelResource注解定义资源,配置QPS阈值,当流量超过阈值时自动触发限流,返回预设的降级结果。
需要特别注意的是,限流并非越严格越好。过度限制可能导致业务可用性下降,需要在稳定性和性能之间找到平衡点。
二、熔断:阻断故障,防止雪崩扩散
如果说限流是"防患于未然",那熔断就是"及时止损"。
熔断器的核心思想类似于电路中的保险丝。当检测到某个下游服务出现异常(响应时间过长、错误率飙升),熔断器会快速"跳闸"——在指定时间内拒绝所有对该服务的请求,避免调用方被拖垮,同时给故障服务留出恢复时间。
Sentinel支持三种熔断策略:
慢调用比例熔断:当响应时间超过阈值的请求比例达到设定值时触发熔断。比如配置RT超过500ms的请求占比达到40%时熔断10秒。
异常比例熔断:当请求失败率(抛异常)超过阈值时触发熔断。比如错误率达到50%时打开熔断器。
异常数熔断:当异常请求数量达到阈值时触发熔断。
三种策略针对不同场景——慢调用应对性能退化,异常比例应对业务故障,开发者可根据业务特点灵活选择。
三、降级:有损可用,优于完全不可用
熔断之后怎么办?直接返回错误给用户吗?降级就是熔断后的"后手"。
降级解决的是"可用性体验"的问题。当核心依赖不可用时,切换到备用方案——返回缓存数据、返回默认值、或者返回友好的提示信息。
比如商品详情页,正常情况需要调用商品服务、库存服务、评价服务。当库存服务熔断后,降级逻辑直接返回"库存充足"的默认值,用户看到的是不完整的页面,但至少页面能打开。
降级和熔断的核心区别在于:熔断是被调用方故障触发的主动规则,降级是基于全局考虑停止某些服务来释放资源。熔断是"不得不停",降级是"主动选择停掉次要的,保住核心的"。
四、三者协同:一套完整的防护体系
限流、熔断、降级不是孤立的,它们需要协同工作:
限流解决"量"的问题,熔断解决"故障扩散"的问题,降级解决"可用性体验"的问题。
一个典型的防护链路是这样的:请求先经过限流器——超过阈值直接拒绝;通过的请求进入业务调用,如果下游服务连续失败,熔断器跳闸,后续请求不再调用下游;熔断后请求走降级逻辑——返回兜底数据或友好提示。
在工具选型上,Sentinel已成为主流选择。与已基本退出技术栈的Hystrix相比,Sentinel提供了更全面的流量控制、熔断降级和系统保护能力。而Resilience4j作为轻量级替代方案,也提供了熔断、限流、降级、超时控制、舱壁模式等全套容错能力。两者各有侧重——Sentinel功能更全、生态更完善,Resilience4j更轻量、更适合对依赖大小敏感的场景。
回到开头的那个凌晨事故。如果当时配置了合理的限流阈值,风控服务不会被瞬间流量压垮;如果熔断策略生效,上游服务不会因为等待风控响应而耗尽线程池;如果降级逻辑存在,至少订单可以走简化流程完成支付。三者缺一,雪崩就可能发生。
根据2025年云原生基金会的最新报告,微服务架构中因级联故障导致的系统宕机事件相比2023年下降了35%——这35%的背后,正是限流、熔断与降级这套组合拳的价值。
稳定性不是一蹴而就的,而是从每一个接口的限流阈值、每一条熔断规则、每一行降级代码中打磨出来的。下次上线前,不妨问自己一句:这个接口的限流配了吗?依赖服务的熔断设了吗?挂了之后有降级方案吗?