初识Hystrix
HystrixCircutBreaker可以防止应用程序重复的尝试调用容易失败的依赖服务。
HystrixCircutBreaker的目的和Retry模式的目的是不同的。
Retry模式令应用程序不断的去重试调用依赖服务,直到最后成功。
而HystrixCircutBreaker是阻止应用程序继续尝试无意义的请求。
HystrixCircutBreaker可以按照如下的状态来实现:
关闭: 应用程序的请求已经路由到了这个操作。HystrixCircutBreaker应该维护最近一段时间的错误信息,如果调用操作失败,那么大力增加这个错误信息的数量。
如果这个错误数量超过给定时间的阈值,HystrixCircutBreaker进入到打开状态。这个时候,HystrixCircuitBreaker启动一个超时的Timer,当Timer过期了,代理则进入半开状态。超时Timer的目的是为了给依赖服务一段时间来自我修复之前碰到的问题。
打开: 令可能失败的外部调用操作立刻失败,所有的外部调用直接抛异常给应用程序。
半开: 只有一定数量的应用请求可以进行操作的调用。如果这些请求成功了,
那么就假定之前发生的错误已经被依赖服务自动修复了,而HystrixCircuitBreaker转换成关闭状态,同事重置错误计数器。如果任何请求失败了,那么
HystrixCircuitBreaker会假定错误仍然错在,HystrixCircutBreaker会重新
转换成打开状态,并重启超时Timer给依赖服务更多的时间来自我修复错误。
二、 解决办法
HystrixCircutBreaker可以防止应用程序不断地尝试执行可能会失败的操作,
使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间
的超时产生。 HystrixCircutBreaker也可以使应用程序能够诊断错误是否
已经修正,如果已经修正,应用程序会再次尝试调用操作。HystrixCircutBreaker
就像是哪些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误
的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定是否允许
操作继续,或者立即返回错误。
HystrixCircutBreaker可以使用状态机来实现,内部模拟以下几种状态。
闭合(closed)状态: 对应用程序的请求能够引起方法的调用。 代理类维护了最近
调用失败的次数,如果某次调用失败,则使失败次数加1。如果最近失败次数超过了
在给定时间内允许的阈值,则代理类切换到断开(open)状态。此时代理开启了一个
超时时钟。当该时钟超过了该时间,则切换到半断开(Half-Open)状态。该超时时间
的设定是给了依赖服务恢复正常。
断开(Open)状态: 在该状态下,对依赖服务的请求会立即返回错误响应。
半断开(Half-Open)状态: 允许对应用程序的一定数量的请求可以去调用依赖服务。
如果对这些请求
demo:
在pom.xml中添加:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
主程序Application类添加@EnableCircuitBreaker
在配置文件中添加:
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
circuitBreaker:
requestVolumeThreshold: 20
errorThresholdPercentage: 50%
sleepWindowInMilliseconds: 30000
使用方法:
在controller或者service的方法增加@HystrixCommand(fallbackMethod = "error")
后面的fallbackMethod方法是断路器的回退方法。
例子:
@HystrixCommand(fallbackMethod = "error")
@GetMapping(value = "/test")
public ResultVo getHystrix(HttpServletRequest request) {
return ResultUtils.success(hystrixService.hiService(request));
}
其定义的回退方法如下:(入参和出参需要和@HystrixCommand定义的方法一致)
ResultVo error(HttpServletRequest request) {
return ResultUtils.error(ResultEnum.PARAMETER_ERROR);
}
参数设置
名称 | 类型 | 含义 | 默认值 |
circuitBreakerEnabled | Boolean | 是否启用断路器 | true |
circuitBreakerErrorThresholdPercentage | Integer | 错误百分比,超过该值打开断路器 | 50 |
circuitBreakerForceClosed | Boolean | 强制断路器打开 | false |
circuitBreakerForceOpen | Boolean | 强制断路器关闭 | false |
circuitBreakerRequestVolumeThreshold | Integer | 10s中内最少的请求量,大于该值,断路器配置才会生效 | 20 |
circuitBreakerSleepWindowInMilliseconds | Integer | 断路器打开后多长时间尝试关闭(Half open) | 5s |
主要是这4个参数
timeoutInMilliseconds: 超时时间,单位为ms,这里配置的3s,实际生产环境需要压测。
requestVolumeThreshold :10s内(Hystrix默认的,一般不用设定)请求数要达到配置的这个数量,才有可能触发断路器。意味着,如果没达到这个数量,比如设置的是20个,如果10s内有19个请求是错误的,那么断路器也不会触发。必须要达到20个 这是触发断路器的必要条件
errorThresholdPercentage:这个参数是错误率,默认的也是50%,意味着10s该接口的20个请求,如果有10个失败,会触发断路器
sleepWindowInMilliseconds:断路器打开之后,不会一直打开,在这个时间段过后,尝试访问服务是否正常(需要手动调用接口,不手动调用接口,断路器一直是Open状态)
以上配置的含义是: 在10s内,如果请求在20个及以上,且有50%失败的情况下,开启断路器;断路器开启30000ms后尝试关闭