Hystrix
雪崩问题
一个服务,依赖于另一个功能服务的,如果这个功能服务挂掉了,那么依赖的服务就不能再用了,这种级联的失败, 我们可以称之为雪崩概述
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等;Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
https://github.com/Netflix/Hystrix
降级
什么是降级
降级是当我们的某个微服务响应时间过长,或者不可用了也就是那个微服务调用不了了,我们不能吧错误信息返回出来,或者让他一直卡在那里,所以要在准备一个对应的策略(一个方法);当发生这种问题的时候我们直接调用这个方法来快速返回这个请求,不让他一直卡在那 ;
当某个微服务调用不了了要做降级,也就是说,要在调用方做降级(不然那个微服务都down掉了再做降级也没什么意义了)
降级步骤
1.在服务调用方法添加依赖 <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.在启动类上添加注解@EnableHystrix
3.在控制器调用方法上添加注解@HystrixCommand(name=“要回调的方法”)
后续可以在被调用的服务当中模拟一个异常,如System.out.println(1/0),看是否回调所写的应对方法。
超时监听
1.模拟响应过慢
2.当响应过慢(默认值是1000),访问时,也会进入到指定的降级方法当中
https://github.com/Netflix/Hystrix/wiki/Configuration
3.在客户端配置文件当中配置超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 3000
4.使用RestTemplate直接调用
使用Fengin调用没有效果,feign对有Hystrix的集成默认情况下是关闭的,我们需要通过参数来开启:
feign:
hystrix:
enabled: true # 开启Feign的熔断功能
熔断
概念
也叫断路器,CirleBreak;当一个微服务调用多次出现问题时(默认是10秒内20次当然 这个也能配置),hystrix就会采取熔断机制,不再继续调用你的方法,而是直接调用降级方法,这样就一定程度上避免了服务雪崩的问题,会在默认5秒钟内和电器短路一样,5秒钟后会试探性的先关闭熔断机制,但是如果这时候再失败一次{之前是20次} 那么又会重新进行熔断;
配置
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000 #设置超时时长
circuitBreaker:
requestVolumeThreshold: 5 # 10秒种访问5次都失败的话, 会断开服务,不调用方法,直接进入fallback
sleepWindowInMilliseconds : 5000 #默认是5秒 5秒后尝试再访问一次服务器
熔断状态机
Closed :关闭状态-断路器关闭,所有请求都正常访问Open: 打开状态-断路器打开,所有请求都会被降级,Hystix会对请求情况计数,当一定时间内失败请求百分比达到阀值,则触发熔断,断路器会完全关闭,默认失败比例阀值是50% ,请求次数最少不低于20次
Half Open: 半开状态-Closed状态不是永久的,关闭后进入休眠时间 (默认是5s),随后断路器会进行半开状态,此时会释放部分请求通过 , 若这些请求都是健康的,则完成打开断路器,否则继续保持关闭,再次进行休眠倒计时
限流
概念
限流, 顾名思义, 就是限制你某个微服务的使用量(可用线程);hystrix通过线程池的方式来管理你的微服务调用,他默认是一个线程池(10大小) 管理你的所有微服务;
一个线程可以理解为一个请求,当10请求同时访问, 都没有得要响应的时候,就会自动调用fallback方法
手动配置
在控制器方法上@HystrixCommand(fallbackMethod = "fallbackMethod",
threadPoolKey = "goods",
threadPoolProperties ={
@HystrixProperty(name = "coreSize",value = "5"),
@HystrixProperty(name = "maxQueueSize",value = "1"}
})
hreadPoolKey 就是在线程池唯一标识, hystrix 会拿你这个标识去计数,看线程占用是否超过了, 超过了就会直接降级该次调用
比如, 这里coreSize给他值为5,那么假设你这个方法调用时间是3s执行完, 那么在3s内如果有超过5个请求进来的话, 剩下的请求则全部降级