Hystrix 是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
简单来说,就是 Hystrix 可以解决雪崩问题。
雪崩问题:
微服务中,服务间调用关系错综复杂,一个请求,可能需要调用多个微服务接口才能实现,
会形成非常复杂的调用链路 。这时,当其中一个微服务出现问题,线程阻塞时,会造成连锁反应,
会使越来越多的线程资源阻塞,甚至导致整个服务器资源耗尽!使得所以的其他服务也都不可用!
这就和雪崩一样,所以称之为雪崩问题。
而 Hystix 解决雪崩问题的方法有两种:
- 线程隔离
- 服务熔断
线程隔离,服务降级
Hystrix 会为每个依赖服务调用 分配一个小的线程池,如果线程池已满的话,调用将被立即拒绝,默认不采用排队,加速失败判定时间。
用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理。
(服务降级:优先保证核心服务可用,非核心服务不可用或弱可用。)
用户的请求故障时,不会被阻塞,也不会无休止的等待或者看到系统崩溃,最少会看到一个执行结果(比如返回一个提示信息) 。
服务降级虽然会导致请求失败,但是不会导致阻塞,而且最多会影响这个依赖服务对应的线程池中的资源,对其它服务没有响应。
触发Hystix服务降级的情况:
-
线程池已满
-
请求超时
下面我们来试一下 服务降级!
依旧是三步走:
- 引入启动器
- 修改配置
- 引导类上添加注解
1.引入启动器
2.修改配置
没有特殊要求,默认配置就可以了,我们不用取修改, 这步就可以直接过了。
3.引导类上加注解
这样之后,就可以使用 熔断 了,来试试。
写个熔断方法,设置熔断之后的信息:
(注意:熔断方法的 返回值类型、参数列表 要和 被熔断方法 返回值类型 、参数列表 一样)
关闭 服务提供方, 启动服务调用方:
如何访问 http://localhost/consumer/user?id=1
我们的熔断——服务降级 就完成了!
事实上,我们不必为每个方法都定义一个熔断方法,我们可以定义一个 全局 的熔断方法 :
(注意:全局熔断方法参数列表必须为空)
如何重启服务调用方,访问 http://localhost/consumer/user?id=1 看看
全局的熔断方法就写好了!
我们跳过的 第2步,修改配置,可以 设置一个超时时间,默认是 1000ms ,我们开发时,默认的就可以了,当服务上线时,因为用户的电脑性能,网络状态等问题,可能访问会比较慢,所以我们需要修改一下超时时间,:
然后再来学一个组合注解 @SpringCloudApplication :
上面这种解决 雪崩问题 的方法 是 服务降级 ,下面我们来看看 Hystrix提供的另一种 解决方式 : 服务熔断 。
熔断机制,类似于家里的 电路保险丝,发生短路时,保险丝熔断,保护整个电路。
而 Hystrix 熔断机制,又强于 电路保险丝
因为Hystrix 在熔断后,会尝试重连:熔断后,拒绝后续请求,一段时间后,接受部分请求,如果调用成功,则恢复正常,否则继续熔断。
Hystrix 熔断 有 3 个状态:
- Closed:关闭状态,所有请求都正常访问。
- Open:打开状态,所有请求都会被降级。
Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全打开。
默认失败比例的阈值是50%,请求次数最少不低于20次。 - 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=2
你会发现,http://localhost/consumer/user?id=2 也不能正常访问了,因为被熔断了。
不过,你等一下,再访问 http://localhost/consumer/user?id=2 ,又可以正常访问了,因为熔断被恢复了!
当然,默认的熔断触发要求较高,休眠时间窗较短,为了测试方便,我们可以通过配置修改熔断策略:
circuitBreaker:
requestVolumeThreshold: 10 #触发熔断的最小请求次数,默认20
sleepWindowInMilliseconds: 10000 #休眠时长,默认是5000毫秒
errorThresholdPercentage: 50 #触发熔断的失败请求最小占比,默认50%
以上就是有关Hystrix的内容了!