Hystrix强力护卫
Posted 爱编码
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hystrix强力护卫相关的知识,希望对你有一定的参考价值。
为什么要用Hystrix
Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力。Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力。为了实现容错和自我保护
Hystrix设计目标:
-
对来自依赖的延迟和故障进行防护和控制——这些依赖通常都是通过网络访问的 -
阻止故障的连锁反应 -
快速失败并迅速恢复 -
回退并优雅降级 -
提供近实时的监控与告警
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原理
1、执行流程
摘自Hystrix官网流程图如下:https://github.com/Netflix/Hystrix/wiki/How-it-Works
Hystrix整个工作流如下:
-
-
构造一个 HystrixCommand或HystrixObservableCommand对象,用于封装请求,并在构造方法配置请求被执行需要的参数; -
-
执行命令,Hystrix提供了4种执行命令的方法,后面详述; -
-
判断是否使用缓存响应请求,若启用了缓存,且缓存可用,直接使用缓存响应请求。Hystrix支持请求缓存,但需要用户自定义启动; -
-
判断熔断器是否打开,如果打开,跳到第8步; -
-
判断线程池/队列/信号量是否已满,已满则跳到第8步; -
-
执行HystrixObservableCommand.construct()或HystrixCommand.run(),如果执行失败或者超时,跳到第8步;否则,跳到第9步; -
-
统计熔断器监控指标; -
-
走Fallback备用逻辑 -
-
返回请求响应
2、源码分析
Hystrix源码跟踪图如下:
如果你想更加深入一步一步跟踪其原理,可以参考这篇集合文章:https://blog.csdn.net/X5fnncxzq4/article/details/80147193
3、Hystrix断路器
熔断器有三个状态 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
以上是关于Hystrix强力护卫的主要内容,如果未能解决你的问题,请参考以下文章