spring cloud 之 Hystrix
Hystrix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)
雪崩:一个服务失败,导致整条链路的服务都失败的情形
Hystrix 主要功能
- 线程池隔离 默认为这个隔离 为每个模块分配线程池,不会因为某一个模块宕机或者出问题而造成所有的资源被耗尽
- 信号量隔离 为模块添加一个阈值,只能有这么多人访问,超过了就不行
降级 :对异常、超时等问题进行处理
- 熔断
- 限流
1、Hystrix 降级
提供方降级:
降级产生的原因有: 出现异常 服务调用超时:默认的超时时间是1s,ribbon的超时时间默认也是1s
- 注入依赖
-
1 <!-- hystrix --> 2 <dependency> 3 4 <groupId>org.springframework.cloud</groupId> 5 6 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> 7 </dependency>
-
- 引导类上添加注解 @EnableCircuitBreaker 开启熔断器
- 定义降级方法
- 降级方法注意事项:1:方法的返回值要和元方法一致 2.方法的参数需要和原方法一样
-
/** * 定义降级方法: * 1. 方法的返回值需要和原方法一样 * 2. 方法的参数需要和原方法一样 */ public Goods findOne_fallback(int id){ Goods goods = new Goods(); goods.setTitle("降级了~~~"); return goods; }
- 在需要降级的方法上添加注解 @HystrixCommand
- 注解中需要添加回调函数,还可以根据业务配置超时时间,保证不在不是因为逻辑代码运行超时而产生降级
-
1 /** 2 * 降级: 3 * 1. 出现异常 4 * 2. 服务调用超时 5 * * 默认1s超时 6 * 7 * @HystrixCommand(fallbackMethod = "findOne_fallback") 8 * fallbackMethod:指定降级后调用的方法名称 9 */ 10 @GetMapping("/findOne/{id}") 11 @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = { 12 //设置Hystrix的超时时间,默认1s 13 @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000") 14 }) 15 public Goods findOne(@PathVariable("id") int id){ 16 17 //1.造个异常 18 int i = 3/0; 19 try { 20 //2. 休眠2秒 超时 21 Thread.sleep(2000); 22 } catch (InterruptedException e) { 23 e.printStackTrace(); 24 } 25 Goods goods = goodsService.findOne(id); 26 27 goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上 28 return goods; 29 }
消费方降级:
由于Feign组件已经集成了Hystrix组件 所以定义Feign调用接口实现类,复写方法,即降级方法
步骤:
- 配置中Feign开启对Hystrix的支持
-
1 # 开启feign对hystrix的支持 2 3 feign: 4 5 hystrix: 6 7 enabled: true
-
- 定义降级方法,即创建一个类实现Feign调用的接口,重写该方法
- 注意该方法要加注解,将其注入ioc容器 @component
-
1 /** 2 * Feign 客户端的降级处理类 3 * 1. 定义类 实现 Feign 客户端接口 4 * 2. 使用@Component注解将该类的Bean加入SpringIOC容器 5 */ 6 @Component 7 public class GoodsFeignClientFallback implements GoodsFeignClient { 8 @Override 9 public Goods findGoodsById(int id) { 10 Goods goods = new Goods(); 11 goods.setTitle("又被降级了~~~"); 12 return goods; 13 } 14 }
- Feign的接口注解中,添加fallback属性,设置降级处理类
-
@FeignClient(value = "HYSTRIX-PROVIDER",fallback = GoodsFeignClientFallback.class) //与提供方相比,此处为字节码文件 public interface GoodsFeignClient { @GetMapping("/goods/findOne/{id}") public Goods findGoodsById(@PathVariable("id") int id); }
-
2、Hystrix 熔断
Hystrix熔断机制,用于监控微服务调用情况,当失败情况达到预定的阈值(5秒失败20次),会打开断路器,拒绝所有请求,直到服务恢复正常为止
熔断器初始情况下是关闭的,当失败达到一定的阈值的时候(默认5s失败20次),熔断器就会打开,此时所有的请求无论是正常还是失败都会出现降级调用,熔断器开启一段时间(默认为5s),此时熔断器会是半开状态,此时会放入一个请求,如果该请求依旧失败,则将断路器状态改变为打开状态,继续上方步骤,如果调用成功,且次数达到阈值,就将断路器关闭
这里可以对断路器进行设置
//监控时间 默认5000 毫秒
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
//失败次数。默认20次
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "20"),
//失败率 默认50%
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50")
3、熔断监控
Hystrix 提供了 Hystrix-dashboard 功能,用于实时监控微服务运行状态。