初识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后尝试关闭

posted @ 2018-09-25 15:48  looyee  阅读(192)  评论(0编辑  收藏  举报