Hystrix 是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。

简单来说,就是 Hystrix 可以解决雪崩问题。

雪崩问题:
微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,
会形成非常复杂的调用链路 。这时,当其中一个微服务出现问题,线程阻塞时,会造成连锁反应,
会使越来越多的线程资源阻塞,甚至导致整个服务器资源耗尽!使得所以的其他服务也都不可用!
这就和雪崩一样,所以称之为雪崩问题。

而 Hystix 解决雪崩问题的方法有两种:

  1. 线程隔离
  2. 服务熔断

 

线程隔离,服务降级

Hystrix 会为每个依赖服务调用 分配一个小的线程池,如果线程池已满的话,调用将被立即拒绝,默认不采用排队,加速失败判定时间。

用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理。
(服务降级:优先保证核心服务可用,非核心服务不可用或弱可用。)

用户的请求故障时,不会被阻塞,也不会无休止的等待或者看到系统崩溃,最少会看到一个执行结果(比如返回一个提示信息) 。

服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。

触发Hystix服务降级的情况:

  • 线程池已满

  • 请求超时

 

下面我们来试一下 服务降级!

依旧是三步走:

  1. 引入启动器
  2. 修改配置
  3. 引导类上添加注解

1.引入启动器

2.修改配置
没有特殊要求,默认配置就可以了,我们不用取修改, 这步就可以直接过了。

3.引导类上加注解

 

这样之后,就可以使用 熔断  了,来试试。

写个熔断方法,设置熔断之后的信息:
(注意:熔断方法的 返回值类型、参数列表 要和 被熔断方法 返回值类型 、参数列表  一样)

 

关闭 服务提供方, 启动服务调用方:

 

如何访问 http://localhost/consumer/user?id=1 

我们的熔断——服务降级 就完成了!

事实上,我们不必为每个方法都定义一个熔断方法,我们可以定义一个 全局 的熔断方法 :
 (注意:全局熔断方法参数列表必须为空)

 

如何重启服务调用方,访问 http://localhost/consumer/user?id=1  看看

全局的熔断方法就写好了!

我们跳过的 第2步,修改配置,可以 设置一个超时时间,默认是 1000ms ,我们开发时,默认的就可以了,当服务上线时,因为用户的电脑性能,网络状态等问题,可能访问会比较慢,所以我们需要修改一下超时时间,:

然后再来学一个组合注解 @SpringCloudApplication :

 

上面这种解决 雪崩问题 的方法 是 服务降级 ,下面我们来看看 Hystrix提供的另一种 解决方式 : 服务熔断 。

熔断机制,类似于家里的 电路保险丝,发生短路时,保险丝熔断,保护整个电路。
而 Hystrix 熔断机制,又强于 电路保险丝
因为Hystrix 在熔断后,会尝试重连:熔断后,拒绝后续请求,一段时间后,接受部分请求,如果调用成功,则恢复正常,否则继续熔断。

Hystrix 熔断 有 3 个状态:

  1. Closed:关闭状态,所有请求都正常访问。
  2. Open:打开状态,所有请求都会被降级。
    Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。
    默认失败比例的阈值是50%,请求次数最少不低于20次。
  3. Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。
    随后断路器会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,
    则会完全关闭断路器。否则继续保持打开,再次进行休眠计时 。

我们来模拟一下试试:
先使 查询 id 为 1 时,发生错误:

然后重启 consumer 服务

先访问  http://localhost/consumer/user?id=2  ,可以正常访问
然后 快速连续访问 http://localhost/consumer/user?id=1 20次,然后在访问http://localhost/consumer/user?id=
你会发现,http://localhost/consumer/user?id=2  也不能正常访问了,因为被熔断了。
不过,你等一下,再访问 http://localhost/consumer/user?id=2  ,又可以正常访问了,因为熔断被恢复了!

当然,默认的熔断触发要求较高,休眠时间窗较短,为了测试方便,我们可以通过配置修改熔断策略:

circuitBreaker:
  requestVolumeThreshold: 10 #触发熔断的最小请求次数,默认20
  sleepWindowInMilliseconds: 10000 #休眠时长,默认是5000毫秒
  errorThresholdPercentage: 50 #触发熔断的失败请求最小占比,默认50%

 

以上就是有关Hystrix的内容了!