Skip to content

服务雪崩与熔断降级

一、核心概念:服务雪崩

服务雪崩是指微服务架构中,一个底层服务失败,占用服务链路资源,导致整条调用链路的服务都失败的连锁反应。比如服务A调用服务B,服务B调用服务C,当服务C故障时,服务B请求超时/失败,大量请求堆积,导致服务B资源耗尽,进而服务A也无法正常响应,故障像雪崩一样扩散到整个系统。


二、熔断降级的作用

熔断降级是解决服务雪崩的核心手段,二者分工明确,共同保护系统稳定性:

  • 服务降级:服务自我保护或保护下游服务的方式,通过关闭非核心功能、返回兜底数据,避免服务因请求突增而崩溃。
  • 服务熔断:监控服务调用情况,当失败率达到阈值时,快速切断故障链路,避免故障扩散,给故障服务恢复时间。
  • 限流:预防手段,限制请求流量,避免系统被大量请求压垮,从源头减少服务雪崩的风险。

三、服务降级详解

1. 什么是服务降级?

服务降级是在服务压力过大或依赖服务故障时,暂时关闭非核心功能,返回预设的兜底数据或提示信息,确保核心功能可用,避免服务整体崩溃。 比如商品详情页的推荐服务故障时,返回“推荐服务暂时不可用”,而非整个页面无法加载。

2. 服务降级的实现方式

通常与Feign接口整合,通过fallback编写降级逻辑:

java
@FeignClient(value = "leadnews-article", fallback = IArticleClientFallback.class)
public interface IArticleClient {
    @PostMapping("/api/v1/article/save")
    public ResponseResult saveArticle(@RequestBody ArticleDto dto);
}

@Component
public class IArticleClientFallback implements IArticleClient {
    @Override
    public ResponseResult saveArticle(ArticleDto dto) {
        return ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR, "获取数据失败");
    }
}

3. 服务降级能解决问题吗?

服务降级不能直接解决底层服务的故障,但能有效防止故障扩散:

  • 它通过快速返回兜底结果,避免请求堆积占用资源,保护调用方服务不被拖垮;
  • 让用户得到明确反馈,而非长时间等待或系统报错;
  • 为底层故障服务争取恢复时间,是应对服务雪崩的关键防线之一。

四、服务熔断详解(以Hystrix为例)

1. 熔断机制原理

Hystrix默认关闭熔断机制,开启需添加@EnableCircuitBreaker注解:

  • 当检测到10秒内请求失败率超过50%,触发熔断机制,断路器从Closed状态变为Open状态;
  • Open状态下,所有请求快速失败,每隔5秒进入Half-Open状态,尝试放行一次请求;
  • 若请求成功,断路器恢复Closed状态;若失败,继续保持Open状态,直到服务恢复。

2. 熔断与降级的区别

特性服务降级服务熔断
触发时机服务压力大、依赖故障、请求突增依赖服务故障、失败率达到阈值
作用对象调用方服务(自我保护)被调用方服务(切断故障链路)
核心目标保证核心功能可用,避免服务崩溃防止故障扩散,给故障服务恢复时间
实现方式编写fallback兜底逻辑断路器自动控制请求放行/拒绝

面试相关问题

  1. 问:什么是服务雪崩?如何解决?答: 服务雪崩是指底层服务故障导致整条链路服务失败的连锁反应。解决方式包括服务降级(返回兜底数据)、服务熔断(切断故障链路)和限流(限制请求流量),三者配合使用可有效防止故障扩散。

  2. 问:服务降级和服务熔断的区别是什么?答: 服务降级是调用方自我保护,通过关闭非核心功能返回兜底数据;服务熔断是切断故障链路,防止故障扩散。降级是主动应对,熔断是被动保护,二者常结合使用。

  3. 问:服务降级能解决服务雪崩吗?答: 服务降级不能直接修复底层故障,但能避免故障扩散,保护调用方服务不被拖垮,是解决服务雪崩的重要手段之一,需配合熔断、限流一起使用。

  4. 问:Hystrix的熔断机制是怎样的?答: Hystrix通过断路器实现熔断,当失败率超过阈值时,断路器打开,请求快速失败;经过一段时间后尝试放行请求,若成功则关闭断路器,恢复正常请求。

Powered by VitePress 1.6.4 | 持续更新中