Hystrix

工作原理
Spring Cloud 容错限流 - 图1
步骤一:创建 command
步骤二:调用 command 执行方法
步骤三:检查是否开启缓存(不太常用)
步骤四:检查是否开启了断路器
步骤五:检查线程池/队列/信号量是否已满
步骤六:执行 command
步骤七:断路健康检查
步骤八:调用 fallback 降级机制

资源隔离

线程池:在需要调用接口的地方使用 command 来管理。设置线程池容量10,然后设置了队列为5。当线程池和队列都满了,直接进行拒绝策略,然后进行降级操作。
信号量:还有一种方式通过 信号量来控制。他主要是调用自己服务内部的数据。不用进行接口调用。

请求缓存

servletContext 参数一样,直接走上一次的缓存。

断路器执行原理

  1. Closed 断路器关闭:调用下游的请求正常通过
  2. Open 断路器打开:阻断对下游服务的调用,直接走 Fallback 逻辑
  3. Half-Open 断路器处于半开状态:SleepWindowInMilliseconds

几个参数:

  • 时间滑动窗口:比如说,要求在 10s 内经过断路器的流量必须达到 20 个,而实际经过断路器的请求有 19 个,即使这 19 个请求全都失败,也不会去判断要不要断路。
  • 异常比例:表示异常比例达到多少,才会触发断路,默认值是 50(%)。
  • 断路器状态由 Close 转换到 Open,在之后 SleepWindowInMilliseconds 时间内,所有经过该断路器的请求会被断路,不调用后端服务,直接走 Fallback 降级机制,默认值 5000(ms)。而在该参数时间过后,断路器会变为 Half-Open 半开闭状态,尝试让一条请求经过断路器,看能不能正常调用。如果调用成功了,那么就自动恢复,断路器转为 Close 状态。

    降级

    Hystrix 出现以下四种情况,都会去调用 fallback 降级机制:

  • 短路:断路器处于打开的状态。

  • reject:资源池已满(线程池+队列 / 信号量)。
  • error:Hystrix 调用各种接口,或者访问外部依赖,比如 MySQL、Redis、Zookeeper、Kafka 等等,出现了任何异常的情况。
  • timeout:访问外部依赖的时候,访问时间过长,报了 TimeoutException 异常。
  • 重试次数达到阈值

我们通过返回默认值,或者直接返回null,或者返回友情提示。

fallback也是需要设置信号量,默认是10。