Hystrix
Hystrix的作用
Hystrix主要是为了解决服务雪崩问题
降级机制:当你的某一服务器出现超时,资源不足,出现了异常时,可以执行一个降级方法,返回一个托底数据。
隔离:两种方式:提供了一个Hystrix线程池,信号量管理Tomcat的线程池。为了防止Tomcat线程池线程耗尽
熔断:当你的某一个服务的请求达到阈值(10s内的20个请求失败率达到50%,一个条件失败都不会触发)时,自动触发降级。
实现降级机制
导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
启动类添加注解(@EnableCircuitBreaker)
在要实现降级的方法上添加注解(@HystrixCommand(fallbackMethod = “findByIdFallBack降级方法的名称”))
实现隔离
使用Tomcat线程去接收用户的请求,使用当前线程去执行其他服务的功能,如果某个服务出现故障,Tomcat的大量线程就会堆积,导致Tomcat无法处理其他业务功能
- Hystrix(默认):接收用户请求采用tomcat的线程池,执行业务代码,调用其他服务时,使用Hystrix的线程池。
- 信号量:信号量相当于交警,使用的还是Tomcat线程池,他只是去帮助我们管理Tomcat的线程池,防止Tomcat线程池耗尽
Hystrix的线程池配置
- execution.isolation.strateg:线程隔离策略—THREAD
- execution.isolation.thread.timeoutInMilliseconds:指定超时时间——1000
- execution.timeout.enabled:是否开启超时时间配置——true
- execution.isolation.thread.interruptOnTimeout:超时之后是否中断线程——true
- execution.isolation.thread.interruptOnCancel:取消任务后知否——false
Hystrix代码实现
@HystrixCommand(fallbackMethod = "findByIdFallBack",commandProperties = { @HystrixProperty(name = "execution.isolation.strategy",value = "THREAD"), @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000") })
信号量的配置信息
- execution.isolation.strateg:线程隔离策略——SEMAPHORE
- execution.isolation.semaphore.maxConcurrentRequests:指定信号量的最大并发请求数——10(1个测试并发是2500)
信号量的代码实现
@HystrixCommand(fallbackMethod = "findByIdFallBack",commandProperties = { @HystrixProperty(name = "execution.isolation.strategy",value = "SEMAPHORE") })
断路器
在调用指定服务时,如果说这个服务的失败率达到你输入的一个阈值,将断路器从closed状态,转变为open状态,指定服务时无法被访问的,如果你访问就直接走fallback方法,在一定的时间内,open状态会再次转变为half open状态,允许一个请求发送到我的指定服务,如果成功,转变为closed,如果失败,服务再次转变为open状态,会再次循环到half open,直到断路器回到一个closed状态。
配置断路器的监控界面
导入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency>
在启动类中添加注解(@EnableHystrixDashboard)
配置一个Servlet路径,指定上Hystrix的Servlet,方法继承HystrixMetricsStreamServlet@WebServlet("/hystrix.stream") public class HystrixServlet extends HystrixMetricsStreamServlet { }
在启动类上,添加扫描Servlet的注解(@ServletComponentScan(“com.qf.servlet”))
测试直接访问http://host:port/hystrix
输入映射好的servlet路径(Ps:Ps:启动成功后,需要访问一个controller接口查看信息)
配置断路器的属性(默认10s秒中之内请求数)
circuitBreaker.enabled:断路器的开关——true
circuitBreaker.requestVolumeThreshold:失败阈值的总请求数——20
circuitBreaker.errorThresholdPercentage:请求总数失败率达到%多少时——50
circuitBreaker.sleepWindowInMilliseconds:断路器open状态后,多少秒是拒绝请求的——5000
circuitBreaker.forceOpen:强制让服务拒绝请求——false
circuitBreaker.forceClosed:强制让服务接收请求——false
代码实现配置@HystrixCommand(fallbackMethod = "findByIdFallBack",commandProperties = { @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "70"), @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000") })