Hystrix实现服务熔断原理
- 原理概述:Hystrix通过监控服务调用的健康情况,如失败率、超时等指标。当这些指标达到一定阈值时,Hystrix会触发熔断机制,停止对该服务的调用,避免级联故障。它会在内部维护一个统计窗口,统计这段时间内的请求数量、成功数量、失败数量等。例如,在10秒的统计窗口内,如果请求失败率超过60%,就可能触发熔断。
- 资源隔离:Hystrix采用线程池隔离或信号量隔离两种方式。线程池隔离为每个依赖服务分配独立的线程池,当某个线程池满时,后续请求将被拒绝,避免因一个服务的故障耗尽整个应用的资源。信号量隔离则是通过限制并发访问的信号量数量来隔离资源。
关键配置
- 熔断相关配置:
hystrix.command.default.circuitBreaker.requestVolumeThreshold
:设定在统计窗口内触发熔断的最小请求数,默认20。例如,如果设置为30,意味着在统计窗口内请求数不到30时,即使失败率高也不会熔断。
hystrix.command.default.circuitBreaker.errorThresholdPercentage
:熔断触发的失败率阈值,默认50%。即失败请求数占总请求数的比例达到此值就触发熔断。
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds
:熔断后进入半开状态的休眠时间,默认5000毫秒。
- 线程池相关配置(若采用线程池隔离):
hystrix.threadpool.default.coreSize
:线程池核心线程数,默认10。
hystrix.threadpool.default.maxQueueSize
:线程池最大队列大小,默认 -1(使用SynchronousQueue,不排队,直接提交任务给线程执行,如果线程忙则拒绝)。
hystrix.threadpool.default.queueSizeRejectionThreshold
:队列拒绝阈值,当达到此值时,新任务将被拒绝,默认5。
使用步骤
- 引入依赖:在
pom.xml
文件中添加Hystrix依赖,例如:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- 启用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);
}
}
- 使用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 "服务不可用,这是降级响应";
}
}
熔断状态机状态及转换条件
- Closed(关闭状态):
- 正常情况:服务调用正常,失败率低于熔断阈值。在此状态下,Hystrix会统计请求的成功、失败等情况。
- 转换条件:当失败率超过
hystrix.command.default.circuitBreaker.errorThresholdPercentage
且请求数达到hystrix.command.default.circuitBreaker.requestVolumeThreshold
时,转换到Open状态。
- Open(打开状态):
- 熔断情况:服务熔断,Hystrix不再调用实际服务,直接返回降级响应。
- 转换条件:当达到
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds
设定的休眠时间后,转换到Half - Open状态。
- Half - Open(半开状态):
- 试探情况:允许部分请求通过,试探服务是否恢复正常。如果请求成功,说明服务可能恢复,转换到Closed状态;如果请求失败,说明服务仍未恢复,回到Open状态。
- 转换条件:若试探的请求成功比例达到一定阈值(如默认的50%成功),则转换到Closed状态;若失败比例过高,则回到Open状态。