MST

星途 面试题库

面试题:微服务架构下Spring Cloud如何实现服务熔断

在Spring Cloud微服务架构中,阐述Hystrix实现服务熔断的原理、关键配置及使用步骤,以及熔断状态机有哪些状态,各状态的转换条件是什么?
44.4万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试

Hystrix实现服务熔断原理

  1. 原理概述:Hystrix通过监控服务调用的健康情况,如失败率、超时等指标。当这些指标达到一定阈值时,Hystrix会触发熔断机制,停止对该服务的调用,避免级联故障。它会在内部维护一个统计窗口,统计这段时间内的请求数量、成功数量、失败数量等。例如,在10秒的统计窗口内,如果请求失败率超过60%,就可能触发熔断。
  2. 资源隔离:Hystrix采用线程池隔离或信号量隔离两种方式。线程池隔离为每个依赖服务分配独立的线程池,当某个线程池满时,后续请求将被拒绝,避免因一个服务的故障耗尽整个应用的资源。信号量隔离则是通过限制并发访问的信号量数量来隔离资源。

关键配置

  1. 熔断相关配置
    • hystrix.command.default.circuitBreaker.requestVolumeThreshold:设定在统计窗口内触发熔断的最小请求数,默认20。例如,如果设置为30,意味着在统计窗口内请求数不到30时,即使失败率高也不会熔断。
    • hystrix.command.default.circuitBreaker.errorThresholdPercentage:熔断触发的失败率阈值,默认50%。即失败请求数占总请求数的比例达到此值就触发熔断。
    • hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds:熔断后进入半开状态的休眠时间,默认5000毫秒。
  2. 线程池相关配置(若采用线程池隔离)
    • hystrix.threadpool.default.coreSize:线程池核心线程数,默认10。
    • hystrix.threadpool.default.maxQueueSize:线程池最大队列大小,默认 -1(使用SynchronousQueue,不排队,直接提交任务给线程执行,如果线程忙则拒绝)。
    • hystrix.threadpool.default.queueSizeRejectionThreshold:队列拒绝阈值,当达到此值时,新任务将被拒绝,默认5。

使用步骤

  1. 引入依赖:在pom.xml文件中添加Hystrix依赖,例如:
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  1. 启用Hystrix:在Spring Boot主类上添加@EnableHystrix注解开启Hystrix功能,例如:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.netflix.hystrix.contrib.javanica.annotation.EnableHystrix;

@SpringBootApplication
@EnableHystrix
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}
  1. 使用Hystrix注解:在需要熔断保护的方法上添加@HystrixCommand注解,并指定熔断后的降级方法,例如:
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.stereotype.Service;

@Service
public class YourService {

    @HystrixCommand(fallbackMethod = "fallbackMethod")
    public String yourMethod() {
        // 正常业务逻辑
        return "正常响应";
    }

    public String fallbackMethod() {
        // 熔断后的降级处理逻辑
        return "服务不可用,这是降级响应";
    }
}

熔断状态机状态及转换条件

  1. Closed(关闭状态)
    • 正常情况:服务调用正常,失败率低于熔断阈值。在此状态下,Hystrix会统计请求的成功、失败等情况。
    • 转换条件:当失败率超过hystrix.command.default.circuitBreaker.errorThresholdPercentage且请求数达到hystrix.command.default.circuitBreaker.requestVolumeThreshold时,转换到Open状态。
  2. Open(打开状态)
    • 熔断情况:服务熔断,Hystrix不再调用实际服务,直接返回降级响应。
    • 转换条件:当达到hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds设定的休眠时间后,转换到Half - Open状态。
  3. Half - Open(半开状态)
    • 试探情况:允许部分请求通过,试探服务是否恢复正常。如果请求成功,说明服务可能恢复,转换到Closed状态;如果请求失败,说明服务仍未恢复,回到Open状态。
    • 转换条件:若试探的请求成功比例达到一定阈值(如默认的50%成功),则转换到Closed状态;若失败比例过高,则回到Open状态。