简介:Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)。

Hystix 主要功能
•隔离
1、线程池隔离
2、信号量隔离
•降级
•熔断
•限流
一、隔离
(1)线程池隔离
不进行隔离时,当服务请求A,线程池进行调用,调用完需要归还给线程池。假如C无响应,则线程池100个线程全给到C,则其他线程不够用。
而Hystrix自动进行线程池隔离,对请求会进行分配,一个服务失败,只会把分配给它的线程使用完,不会占用其他线程。

(2)信号量隔离
如:限制对其中一个服务的访问次数,访问人数
二、熔断
假如某服务一直错,把所有服务全熔断。还有恢复机制,等服务恢复时,让整个服务恢复。
三、降级
Hystix 降级:当服务发生异常或调用超时,返回默认数据。
降级思路:
(1)Hystrix 降级 – 服务提供方

1.在服务提供方,引入 hystrix 依赖
2.定义降级方法
3.使用 @HystrixCommand 注解配置降级方法
4.在启动类上开启Hystrix功能:@EnableCircuitBreaker
(2)Hystrix 降级 – 服务消费方

1.feign 组件已经集成了 hystrix 组件。
2.定义feign 调用接口实现类,复写方法,即 降级方法
3.在 @FeignClient 注解中使用 fallback 属性设置降级处理类。
4.配置开启 feign.hystrix.enabled = true
代码举例:
Goods Controller 服务提供方Hystrix降级:
@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){
//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;
}
/**
* 定义降级方法:
* 1. 方法的返回值需要和原方法一样
* 2. 方法的参数需要和原方法一样
*/
public Goods findOne_fallback(int id){
Goods goods = new Goods();
goods.setTitle("降级了~~~");
return goods;
}
}
消费者端 调用服务的降级:
GoodsFeignClient.java:
@FeignClient(value = "HYSTRIX-PROVIDER",fallback = GoodsFeignClientFallback.class)
public interface GoodsFeignClient {
@GetMapping("/goods/findOne/{id}")
public Goods findGoodsById(@PathVariable("id") int id);
}
GoodsFeignClientFallback.java:
/**
* Feign 客户端的降级处理类
* 1. 定义类 实现 Feign 客户端接口
* 2. 使用@Component注解将该类的Bean加入SpringIOC容器
*/
@Component
public class GoodsFeignClientFallback implements GoodsFeignClient {
@Override
public Goods findGoodsById(int id) {
Goods goods = new Goods();
goods.setTitle("又被降级了~~~");
return goods;
}
}
四、熔断

可修改默认参数,修改熔断监控时间和次数:
@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")
})