服务熔断、服务限流和服务降级是构建高可用、高弹性系统的三大基石,它们的目标一致(保证系统核心功能可用),但着眼点和实现方式不同。


一、核心概念对比

特性 服务熔断 (Circuit Breaker) 服务限流 (Rate Limiting / Throttling) 服务降级 (Service Degradation)
核心目标 快速失败,防止连锁故障。故障隔离 控制流量,防止系统被突发流量冲垮。过载保护 弃车保帅,牺牲非核心功能,保证核心功能可用。体验保全
触发条件 依赖的下游服务失败率/超时率达到阈值。 流量/并发数达到预设的阈值(如QPS、线程数)。 1. 系统资源普遍不足(如CPU、线程池满)。
2. 熔断限流发生后。
作用对象 主要是对下游依赖服务的调用进行控制。 主要是对进入本服务的请求流量进行控制。 主要是对本服务提供的功能进行调整。
实现层面 通常集成在服务调用框架中(如Feign、Dubbo)。 通常位于网关/入口层服务内部(如Sentinel、Hystrix)。 业务逻辑层,需要根据业务预先设计。
状态恢复 半开状态自动探测下游是否恢复,然后闭合电路。 一旦流量峰值过去,或下一个时间窗口到来,自动恢复 需要手动或自动检测系统资源恢复后,重新开启完整功能。
好比 家里的空气开关。某个线路(下游服务)短路(故障),立即跳闸(熔断),保护整个家(系统)不被烧毁。 热门景区的限流措施。只允许同时进入5000人(阈值),后面的游客必须排队等待,防止景区(系统)崩溃。 双十一的电商网站。为了保证你能下单和支付(核心功能),暂时关闭了商品评论、推荐算法(非核心功能)。

二、详细解释与关系

1. 服务熔断 (Circuit Breaker)

  • 是什么:一种自动化的故障保护机制。它监控对某个特定服务的调用(如A服务调用B服务)。
  • 如何工作
    1. 关闭状态 (Closed):正常调用下游服务。
    2. 打开状态 (Open):当调用失败(超时、异常等)的次数在一个时间窗口内达到阈值,熔断器会跳闸,进入打开状态。在此状态下,所有对此服务的调用会立即失败,不再真正发起网络请求(快速失败)。
    3. 半开状态 (Half-Open):熔断器打开一段时间后,会进入半开状态,尝试放行一个请求去探测下游服务是否恢复。如果成功,则闭合熔断器(回到Closed);如果仍然失败,则继续保持打开状态。
  • 目的:防止单个下游服务的故障导致整个系统的线程池被占满、资源被拖垮,从而引发雪崩效应

2. 服务限流 (Rate Limiting / Throttling)

  • 是什么:控制请求的速率或并发数量,将流量限制在系统所能处理的合理范围之内。
  • 常见算法
    • 计数器法:限制单位时间内的请求数(如每秒100次)。
    • 漏桶算法:以恒定的速率处理请求,平滑流量。
    • 令牌桶算法:允许一定程度的突发流量(比如每秒100个请求,但桶里攒了100个令牌,可以瞬间处理100个请求)。
  • 目的:应对突发流量(如秒杀活动),保证系统不会因为超出其处理能力而崩溃,同时也能起到均匀利用系统资源的作用。

3. 服务降级 (Service Degradation)

  • 是什么:一种有损策略。当系统资源(如响应时间、CPU、内存)紧张时,主动关闭或简化一些非核心的业务功能,从而释放出更多的资源来保证核心业务的顺畅运行。
  • 如何实现
    • 手动降级:提前配置好降级开关,在大促前通过配置中心手动开启。
    • 自动降级:系统根据监控指标(如平均响应时间、错误率)自动触发。
  • 降级后的处理方式
    • 返回兜底数据 (Fallback):如返回一个默认值、缓存中的旧数据。
    • 返回空值
    • 提示友好信息:如服务繁忙,请稍后再试。
  • 目的保证核心流程的通过,提升用户体验的底线。即使整个系统有点慢,但用户最关心的功能(如下单、付款)仍然可用。

三、三者之间的协同关系

这三者通常不是孤立存在的,而是在一个完整的微服务架构中协同工作,共同抵御流量洪峰和依赖故障。

一个典型的场景:

  1. 双十一零点,流量激增(触发条件)。
  2. 网关层首先进行限流,将超过系统处理能力的请求直接拒绝或排队,保护系统入口。
  3. 系统内服务A调用服务B,但由于服务B压力过大,响应缓慢且超时增多。
  4. 服务A中的熔断器检测到服务B的失败率超过阈值,迅速熔断对B的调用,避免服务A的线程被拖垮。
  5. 由于服务B不可用,而服务B提供的功能又是服务A的非核心功能(比如商品详情页的猜你喜欢),于是服务A触发服务降级,暂时屏蔽猜你喜欢模块,并返回一个空的兜底数据。
  6. 服务A的核心功能(如展示商品基本信息、库存)依然正常提供服务
  7. 当流量高峰过去,服务B压力下降,熔断器探测到成功,自动闭合,系统逐步恢复正常。

总结

  • 服务限流预防措施,在系统入口控制流量,不让问题产生
  • 服务熔断故障隔离措施,在依赖调用环节快速失败,防止问题扩散
  • 服务降级应急措施,在系统内部牺牲次要功能,保证核心功能可用,是问题发生后的最终保障

它们三者相辅相成,共同构成了分布式系统稳定性的护城河。