Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力。Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力。为了实现容错和自我保护
Hystrix设计目标:
上篇文章中关于feign有过介绍,feign是集成了Hystrix的组件,所以使用Hystrix功能,不需要在引用额外的依赖,只需开启其配置就行。
1、在pom文件里添加histyix的相关依赖。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
2、接口的改造
因为Feign是应用在接口上的,所以在其@FeignClient注解上需要增加配置。
@FeignClient(value = "eureka-client", configuration = FeginConfig.class, fallback = HiHystrix.class)
public interface EurekaClientFeign {
@GetMapping("/hello/")
String hello(@RequestParam String name);
}
在@FeignClient注解上增加了fallback = HiHystrix.class的配置,当访问接口出现异常时,回调HiHystrix类进行处理。
@Component
public class HiHystrix implements EurekaClientFeign{
@Override
public String hello(String name) {
return "hi, " + name + ", error";
}
}
3、application.properties的修改
spring.application.name=eureka-feign
server.port=8081
eureka.client.serviceUrl.defaultZone=http://localhost:1101/eureka/
# 添加开启Hystrix的配置
feign.hystrix.enabled=true
特别地,如果你需要自定义限流操作的话,还需要添加下面配置:
####################1、线程池隔离配置##############
# 隔离策略
hystrix.command.default.execution.isolation.strategy=THREAD
# 核心线程数
hystrix.threadpool.default.coreSize=10
# 最大任务队列容量
hystrix.threadpool.default.maxQueueSize=30
# 任务拒绝的任务队列阈值
hystrix.threadpool.default.queueSizeRejectionThreshold=30
# 超时时间上限
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=2000
####################2、信号量隔离配置##############
# 隔离策略
hystrix.command.default.execution.isolation.strategy=SEMAPHORE
# 最大并发请求上限
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=10
更多配置可参考文章:https://www.cnblogs.com/throwable/p/11961016.html
摘自Hystrix官网流程图如下:https://github.com/Netflix/Hystrix/wiki/How-it-Works
Hystrix整个工作流如下:
Hystrix源码跟踪图如下:
如果你想更加深入一步一步跟踪其原理,可以参考这篇集合文章:https://blog.csdn.net/X5fnncxzq4/article/details/80147193
熔断器有三个状态 CLOSED 、 OPEN 、 HALF_OPEN 熔断器默认关闭状态,当触发熔断后状态变更为 OPEN ,在等待到指定的时间,Hystrix会放请求检测服务是否开启,这期间熔断器会变为 HALF_OPEN 半 开启状态,熔断探测服务可用则继续变更为 CLOSED 关闭熔断器。
Closed :关闭状态(断路器关闭),所有请求都正常访问。代理类维护了最近调用失败的次数, 如果某次调用失败,则使失败次数加1。如果最近失败次数超过了在给定时间内允许失败的阈值, 则代理类切换到断开(Open)状态。此时代理开启了一个超时时钟,当该时钟超过了该时间,则切 换到半断开(Half-Open)状态。该超时时间的设定是给了系统一次机会来修正导致调用失败的错 误。
Open :打开状态(断路器打开),所有请求都会被降级。Hystix会对请求情况计数,当一定时间 内失败请求百分比达到阈值,则触发熔断,断路器会完全关闭。默认失败比例的阈值是50%,请求 次数最少不低于20次。
Half Open :半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路 器会自动进入半开状态。此时会释放1次请求通过,若这个请求是健康的,则会关闭断路器,否则 继续保持打开,再次进行5秒休眠计时。
断路器circuitBreaker相关配置
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000 #默认的连接超时时间1秒,若1秒没有返回数据,自动的触发降级逻辑
circuitBreaker:
enabled: true
# 设置将使断路器打开的滑动窗口中的最小请求数量。
requestVolumeThreshold: 5
# 设置一个错误百分比,当请求错误率超过设定值,断路器就会打开。
errorThresholdPercentage: 10
#设置断路器打开后拒绝请求的时间量,每隔一段时间(sleepWindowInMilliseconds,单位是毫秒)允许再次尝试(也就是放行一个请求
sleepWindowInMilliseconds: 10000
https://github.com/Netflix/Hystrix/wiki/How-it-Works https://www.cnblogs.com/throwable/p/11961016.html https://blog.csdn.net/X5fnncxzq4/article/details/80147193