typora-root-url: img
Hystrix 熔断器
概述
- Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)。
- 雪崩:一个服务失败,导致整条链路的服务都失败的情形。
- Hystix 主要功能:
- 隔离
- 线程池隔离
- 信号量隔离
- 降级
- 熔断
- 限流
- 隔离
线程池隔离
信号量隔离
Hystrix 默认线程池隔离。
降级:异常,超时
熔断:当异常错误达到一定的数量,该服务端的该接口拒绝所有请求(熔断器打开),睡眠一定时间,然后熔断器半开,放少量请求过来,如果正常处理,则熔断器关闭,接口服务正常运行,正常的处理请求。
限流:指定信号量隔离的阈值。多出来的请求等着。就像吃饭排队一样。
Hystrix 降级 – 服务提供方
Hystix 降级:当服务发生异常或调用超时,返回默认数据
处理步骤
- 在服务提供方,引入 hystrix 依赖
- 定义降级方法
- 使用 @HystrixCommand 注解配置降级方法
- 在启动类上开启Hystrix功能:@EnableCircuitBreaker
在服务提供方,引入 hystrix 依赖
<!-- 1、hystrix -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
定义降级方法,直接在对应接口的方法中定义降级方法
使用 @HystrixCommand 注解配置降级方法,可以自定义超时时间等
@RestController
@RequestMapping("/goods")
public class GoodsController {
@Autowired
private GoodsService goodsService;
@Value("${server.port}")
private int port;
/**
* 降级:
* 1. 出现异常
* 2. 服务调用超时
* * 默认1s超时
*
* @HystrixCommand(fallbackMethod = "findOne_fallback")
* fallbackMethod:指定降级后调用的方法名称
*/
@GetMapping("/findOne/{id}")
@HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {
//设置Hystrix的超时时间,默认1s
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public Goods findOne(@PathVariable("id") int id){
Goods goods = goodsService.findOne(id);
goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上
return goods;
}
/**
* 定义降级方法:
* 1. 方法的返回值需要和原方法一样
* 2. 方法的参数需要和原方法一样
*/
public Goods findOne_fallback(@PathVariable("id") int id){
Goods goods = new Goods();
goods.setTitle("服务端降级了~~~");
return goods;
}
}
在启动类上开启Hystrix功能:@EnableCircuitBreaker
@EnableEurekaClient //该注解 在新版本中可以省略
@SpringBootApplication
@EnableCircuitBreaker // 开启Hystrix功能
public class ProviderApp {
public static void main(String[] args) {
SpringApplication.run(ProviderApp.class,args);
}
}
Hystrix 降级 – 服务消费方
处理步骤
1、fegin组件已经集成hystrix组件,不用导入依赖
2、定义fegin的接口实现类,重写远程调用方法,即降级方法
3、在 @FeginClient注解中使用fallback属性设置降级处理类
4、配置开启fegin.hystrix.enabled=true
定义fegin的接口实现类,重写远程调用方法,即降级方法
在 @FeginClient注解中使用fallback属性设置降级处理类
配置开启fegin.hystrix.enabled=true,application.yml配置文件
# 开启消费端的服务降级功能,默认是关闭状态
feign:
httpclient:
enabled: true
两边同时设置了降级策略,如果服务提供方出现异常,则服务提供端降级策略触发,消费端不会触发,因为放回的降级数据也是正常的数据。
Hystrix 熔断
概述
Hystrix 熔断机制,用于监控微服务调用情况,当失败的情况达到预定的阈值(5秒失败20次),会打开断路器,拒绝所有请求,直到服务恢复正常为止。
默认情况下,是开启熔断器的机制 断路器打开,全部请求都是访问降级方法
我们只需要配置几个属性即可
@GetMapping("/findOne/{id}")
@HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {
//设置Hystrix的超时时间,默认1s
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000"),
//监控时间 默认5000 毫秒
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
//失败次数。默认20次
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "20"),
//失败率 默认50%
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50")
})
public Goods findOne(@PathVariable("id") int id){
//如果id == 1 ,则出现异常,id != 1 则正常访问
if(id == 1){
//1.造个异常
int i = 3/0;
}
/*try {
//2. 休眠2秒
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
Goods goods = goodsService.findOne(id);
goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上
return goods;
}