Hystrix 的熔断机制
服务间的调用存在服务雪崩情况,服务间的雪崩情况会引起其他调用方请求超时和请求堵塞情况。为了解决这种情况,使用 hystrix 进行解决。
主要实现方式:
- 线程隔离。
1.每个服务分配独立的线程池连接数
2.服务降级处理,设置超时时间,快速返回信息- 服务熔断。 相当于家里电路熔断器
1.设置服务的阙值、超时次数、休眠时间。当超过阙值会进行休眠,直接返回信息。
2.设置连接时长、读取时长,当超时直接返回信息
项目搭建
pom文件引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
application 主方法加上 @EnableCircuitBreaker
1.@SpringCloudApplication = @EnableDiscoveryClient + @SpringBootApplication + @EnableCircuitBreaker
2.使用 @EnableCircuitBreaker 而不是使用 @EnableHystrix,因为 @EnableHystrix 只是服务熔断,不包含线程隔离,所以使用 @EnableCircuitBreaker
线程隔离
1.每个服务分配独立的线程池连接数
通常是通过zuul 进行分配的,还没学习到,以后补充上来 …
2.服务降级处理,设置超时时间,快速返回信息
[^小技巧]:实现熔断机制可以手动在 Mircorservice-user 项目接口中加入一个线程睡眠时间。
- 方法上使用,作用于该方法。
1.熔断方法和接口的参数和返回值类型必须相同,不相同就会报错。
2.可以配置一些相关配置,在 源码 HystrixCommandProperties 中,介绍几种常用的配置。
- execution.isolation.thread.timeoutInMilliseconds 执行超时时长,默认是1000 毫秒,单位是毫秒
- execution.timeout.enabled 执行超时时长是否开启,默认是开启
- 类上使用,作用于该类。
全局配置或者针对某个服务设置属性
在yml 配置 相关配置文件
hystrix.command.[服务名称].execution.isolation.thread.timeoutInMilliseconds:毫秒
上面default 是代表所有的服务接口配置,如果指定相对应的服务名称也可以。
服务熔断
Hystrix 可以实现弹性容错,当情况好转则自动重连。服务调用方可以自己进行判断某些服务反应慢或者存在大量超时情况时,能够主动熔断,防止整垮整个系统。
Hystrix 熔断状态机模型
通过上图流程:
- 如果熔断器一直success或者失败次数低于 threshold(阙值),则熔断器一直处于 Closed 状态 。
- 当熔断器处于失败次数高于 threshold (阙值),则熔断器处于开启(Open)状态,当时间过了reset timeout ,熔断器处于半开启(Half Open)状态,放部分连接通过,如果还是失败,则继续处于开启(Open)状态,然后又到了超时重置时间,如果还是失败,则循环上面操作,如果成功,则进入关闭(Closed)状态。
实现方式
方式1. commandProperties 中增加配置信息
方式2. yml 配置 文件中增加配置信息
circuitBreaker.requestVolumeThreshold: 请求量阙值,默认 20 个请求
circuitBreaker.sleepWindowInMilliseconds: 休眠时长,默认时长 5000 毫秒
circuitBreaker.errorThresholdPercentage: 错误阙值百分比,默认 50%