Hystrix
概述
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免地会调用失败,比如超时,异常等,Hystrix能够保证一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间,不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
工作流程
- 构造HystrixCommand或者HystrixObservableCommand对象
- 执行Command命令。
- 查看Command命令的响应缓存。
- 判断熔断是否打开。
- 看看线程池、队列、信号池是否满了。
- 构建或执行。
- 计算熔断器的健康状态。
- 进行降级处理。
- 正常返回。
Hystrix主要作用
主要有四个作用
- 服务降级
- 服务熔断
- 接近实时的监控
- 限流、隔离等
服务降级
fallback:当服务不可用的时候,向调用放返回一个符合预期的,可处理的备选响应。类似于默认结果。
触发服务降级的条件
- 程序运异常行
- 超时
- 服务熔断触发服务降级
- 线程池/信号量打满也会导致服务降级
服务熔断
break:类比保险丝,达到最大服务访问量后,直接拒绝访问,拉闸先点,然后调用服务降级的方法并返回友好结果。
熔断机制是应对雪崩效应的一种微服务链路保护机制,当扇出链路的某个微服务出错不可用或者响应时间太长,会进行服务的降级,今儿熔断该节点微服务的调用,快速返回错误的响应信息。
service使用服务熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback",commandProperties = {
@HystrixProperty(name="circuitBreaker.enabled",value="true"), // 是否开启断路器
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value="10"), // 请求次数
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value="10000"), // 时间窗口期
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value="60")}) // 失败率达到多少后熔断
@HystrixProperty参数说明:
参数名 | 作用 | 例子 |
---|---|---|
circuitBreaker.enabled | 是否开启断路器 | true |
circuitBreaker.requestVolumeThreshold | 请求次数 | 10 |
circuitBreaker.errorThresholdPercentage | 失败率达到多少熔断 | 60 |
circuitBreaker.sleepWindowInMilliseconds | 时间窗口期 | 10000 |
服务的降级->进而熔断->恢复调用链路
服务限流
flowlimit:秒杀高并发等操作,严禁一窝蜂地过来拥挤,大家排队,有序进行。
mave依赖
<!-- hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
yml配置
server:
port: 8001
spring:
application:
name: eureka-order-feign-hystrix
eureka:
client:
#表示将自己注册进EurekaServer,默认为true
register-with-eureka: false
#是否从EurekaServer抓取已有的注册信息,默认为true,单节点无所谓,集群必须配置为true
fetch-registry: true
service-url:
#单机注册
defaultZone: http://localhost:7001/eureka
#设置OpenFeign的客户端超时时间(OpenFeign底层是Ribbon)
ribbon:
#读取超时时间,建立连接后服务器取到可用资源所用的时间
ReadTimeout: 5000
#连接所用的时间,适用于网络正常情况下,两端连接所用的时间
ConnectTimeout: 5000
Hystrix的降级配置
使用@HystrixCommand注解
服务端改进
服务端自身改进(8001):设置自身调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法处理,做服务降级(fallback)。返回一个预期的可处理的备选结果。
实现步骤:
-
在业务逻辑类的方法上加上@HystrixCommand注解
fallbackMethod:一旦调用方法失败并抛出了错误信息后,会自动调用该属性所指定的方法。注意需要与原方法的输入参数和输出参数一致。
commandProperties:服务降级参数,参数类型:@HystrixProperty。
-
@HystrixProperty注解:@HystrixCommand的一个属性参数。
execution.isolation.thread.timeoutInMilliseconds:自身调用超时时间峰值,峰值内正常运行,如果超过峰值,那么进入到fallbackMethod方法兜底,单位毫秒。
-
此时8001的Service业务层代码(注意超时逻辑睡眠5秒钟了,但熔断降级是3秒钟):
-
主启动类加上@EnableCircuitBreaker注解