hystrix 简介
Hystrix是什么
在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。
Hystrix为了什么
Hystrix被设计的目标是:
- 对通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。
- 在复杂的分布式系统中阻止级联故障。
- 快速失败,快速恢复。
- 回退,尽可能优雅地降级。
- 启用近实时监控、警报和操作控制。
Hystrix解决了什么问题
复杂分布式体系结构中的应用程序有许多依赖项,每个依赖项在某些时候都不可避免地会失败。如果主机应用程序没有与这些外部故障隔离,那么它有可能被他们拖垮
接下来开打:整合springcloud
在工程中引用jar包:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
服务的降级使用:
启动类上加入 @EnableHystrix注解 开启hystrix功能
在controller的方法上加入注解:
@HystrixCommand
fallbackMethod 属性 代表降级要调用的方法:比如
@GetMapping("/getHystrix/{id}")
@HystrixCommand(fallbackMethod = "demotionMethod",
commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 开启熔断
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), // 在规定时间的请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "6000"), // 规定的时间
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),}) // 规定的时间失败率
public String getHystrix(@PathVariable(name = "id") Integer id) throws InterruptedException {
if (id <= 0)
throw new RuntimeException();
String hystrix = consumerFeign.getHystrix(234);
return hystrix;
}
public String demotionMethod(Integer id) throws InterruptedException {
return "哦豁 服务遇到点小麻烦。。。"+Thread.currentThread().getName();
}
demotionMethod 方法就是服务降级时候调用的方法
调用接口超时时间设置 在yml中:
#此项内容也可以通过注解去设置
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000 #服务降级时间2秒
这样服务的降级功能就完成了 当发生异常 响应超时,和一些错误信息的时候 就会自动调用降级的方法返回给调用方
hystrix的服务熔断限流
@HystrixCommand(fallbackMethod = "demotionMethod",
commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 开启熔断
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), // 在规定时间的请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "6000"), // 规定的时间
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),}) // 规定的时间失败率
这些就是配置服务的熔断的参数也是在
@HystrixCommand 中配置
commandProperties 的属性:
注意:熔断功能要在yml中开启:
feign:
client:
config:
default:
connectTimeout: 5000 #连接超时时间
readTimeout: 5000 #请求与响应的时间间隔阈值
hystrix:
enabled: true # 开启服务的熔断机制
这些配置的参数记不住没关系的 你只需要记住一个类就可以了:
HystrixCommandProperties类中定义了需要配置的所有属性,以及默认的属性值:
熔断机制默认是10秒发送20次请求,有百分之50的请求失败就会进入到断开的状态
熔断器原理
熔断器模式定义了熔断器开关相互转换的逻辑:
服务的健康状况 = 请求失败数 / 请求总数.
熔断器开关由关闭到打开的状态转换是通过当前服务健康状况和设定阈值比较决定的.
1、当熔断器开关关闭时, 请求被允许通过熔断器. 如果当前健康状况高于设定阈值, 开关继续保持关闭. 如果当前健康状况低于设定阈值, 开关则切换为打开状态.
2、当熔断器开关打开时, 请求被禁止通过.
3、当熔断器开关处于打开状态, 经过一段时间后, 熔断器会自动进入半开状态, 这时熔断器只允许一个请求通过. 当该请求调用成功时, 熔断器恢复到关闭状态. 若该请求失败, 熔断器继续保持打开状态, 接下来的请求被禁止通过.熔断器的开关能保证服务调用者在调用异常服务时, 快速返回结果, 避免大量的同步等待.并且熔断器能在一段时间后继续侦测请求执行结果, 提供恢复服务调用的可能.
打完收工