雪崩效应介绍:
简单来说如果A调用B ,B调用C 这个时候如果C服务器发生问题,B服务一直无法调用C服务的接口,这个时候A 如果继续有请求过来 就会造成服务延迟,最后服务就会崩溃。
当多个服务同时调用时,没有及时响应,会形成一个堆积,会一直在等待,连接有没有释放,这样导致接口无法访问,hystrix就是为了解决这个问题
解决方案:
方案一:超时机制和服务降级(调用方处理)
如果一个服务没有及时调用另一个服务,就会抱一个超时错误。如果想做超时机制,需要做一个降级处理,降级处理就相当于服务的接口发生错误的时候,不去直接调用接口而是去调用本地方法
使用Feign:
- 主函数使用@EnableFeginClients
- yml中配置使用Fegin降级,
- 在调用的类中添加fallback,Fallback.class指的是服务降级的类
- Fallback类:
方案二:熔断机制(被调用方处理)
熔断器概述:
熔断器状态(closed、open、half_open)
- closed->open:正常情况下熔断器为closed状态,当访问同一个接口次数超过指定的比例时,就会打开熔断机制,这时候熔断器状态从closed->open。
- open->half-open:当熔断器状态为open时,所有服务调用方调用该服务方法时候都是执行本地降级方法,hychrix提供了一个时间窗口,当熔断器状态变为open时开启一个时间窗口,这时调用调用该服务的方法时都委托给降级方法执行,如果时间超过了时间窗口,则把熔断状态从open->half-open,这时候服务调用方调用服务接口时候,就可以发起远程调用而不再使用本地降级接口,如果发起远程调用还是失败,则重新设置熔断器状态为open状态,从新记录时间窗口开始时间
- half-open->closed: 当熔断器状态为half-open,这时候服务调用方调用服务接口时候,就可以发起远程调用而不再使用本地降级接口,如果发起远程调用成功,则重新设置熔断器状态为closed状态
使用:
- 主函数添加@EnableCircuitBreaker和@EnableHystrixDashboard
- 在接口上添加:
说明:
- enabled:设置熔断机制,true开启
- requestVolumeThreshoId:断路器的最小请求数,请求超过这个数量时会使用断路器
- sleepWindowInMilliseconds:时间窗口,触发断路器时等待的时间
- errorThresholdPercentage:百分比,拿最小请求数10举例,当请求数为10 * 0.6时会进入 open->half-open状态
- @HystrixCommand中有一个元素:fallbackMethod,可以用它来设置进入断路器时候调用的方法
@HystrixCommand源码说明:
查看@HystrixCommand,点击hystrix找到HystrixCommandProperties抽象类
可以看到这个类是@HystrixCommand默认的实例,在它的构造函数中可以看到默认的一些配置
可以通过配置文件将进行修改它的超时时间:
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=30000