3.1-Hystrix-概述

• Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)。
• 雪崩:一个服务失败,导致整条链路的服务都失败的情形

Hystix 主要功能
• 隔离
线程池隔离
信号量隔离
• 降级:异常,超时
• 熔断
• 限流

1587542720216.png

1587542762104.png

3.2-Hystrix-降级

3.2.1-提供方降级

Hystix 降级:当服务发生异常或调用超时,返回默认数据

服务提供方降级

  1. 在服务提供方,引入 hystrix 依赖

    1. <!-- hystrix -->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    5. </dependency>
  2. 定义降级方法

  1. /**
  2. * 定义降级方法:
  3. * 1. 方法的返回值需要和原方法一样
  4. * 2. 方法的参数需要和原方法一样
  5. */
  6. public Goods findOne_fallback(int id){
  7. Goods goods = new Goods();
  8. goods.setTitle("降级了~~~");
  9. return goods;
  10. }
  1. 使用 @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. //1.造个异常
  17. int i = 3/0;
  18. try {
  19. //2. 休眠2秒
  20. Thread.sleep(2000);
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. Goods goods = goodsService.findOne(id);
  25. goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上
  26. return goods;
  27. }
  1. 在启动类上开启Hystrix功能:@EnableCircuitBreaker
  1. package com.itheima.provider;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
  5. import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
  6. /**
  7. * 启动类
  8. */
  9. @EnableEurekaClient //该注解 在新版本中可以省略
  10. @SpringBootApplication
  11. @EnableCircuitBreaker // 开启Hystrix功能
  12. public class ProviderApp {
  13. public static void main(String[] args) {
  14. SpringApplication.run(ProviderApp.class,args);
  15. }
  16. }

3.2.2-消费方降级

  1. feign 组件已经集成了 hystrix 组件。
  2. 定义feign 调用接口实现类,复写方法,即 降级方法
    GoodsFeignClientFallback
  1. package com.itheima.consumer.feign;
  2. import com.itheima.consumer.domain.Goods;
  3. import org.springframework.stereotype.Component;
  4. /**
  5. * Feign 客户端的降级处理类
  6. * 1. 定义类 实现 Feign 客户端接口
  7. * 2. 使用@Component注解将该类的Bean加入SpringIOC容器
  8. */
  9. @Component
  10. public class GoodsFeignClientFallback implements GoodsFeignClient {
  11. @Override
  12. public Goods findGoodsById(int id) {
  13. Goods goods = new Goods();
  14. goods.setTitle("又被降级了~~~");
  15. return goods;
  16. }
  17. }
  1. @FeignClient 注解中使用 fallback 属性设置降级处理类。
    GoodsFeignClient
  1. package com.itheima.consumer.feign;
  2. import com.itheima.consumer.domain.Goods;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. @FeignClient(value = "HYSTRIX-PROVIDER",fallback = GoodsFeignClientFallback.class)
  7. public interface GoodsFeignClient {
  8. @GetMapping("/goods/findOne/{id}")
  9. public Goods findGoodsById(@PathVariable("id") int id);
  10. }
  1. 配置开启 feign.hystrix.enabled = true
    application.yml
  1. # 开启feign对hystrix的支持
  2. feign:
  3. hystrix:
  4. enabled: true

3.3-Hystrix-熔断

3.3.1-熔断-概念

• Hystrix 熔断机制,用于监控微服务调用情况,当失败的情况达到预定的阈值(5秒失败20次),会打开
断路器,拒绝所有请求,直到服务恢复正常为止。

断路器三种状态:打开、半开、关闭、

1587543649656.png

3.3.2-熔断-代码演示

修改服务提供方的方法,演示熔断机制

熔断配置

• circuitBreaker.sleepWindowInMilliseconds:监控时间
• circuitBreaker.requestVolumeThreshold:失败次数
• circuitBreaker.errorThresholdPercentage:失败率

GoodsController

  1. package com.itheima.provider.controller;
  2. import com.itheima.provider.domain.Goods;
  3. import com.itheima.provider.service.GoodsService;
  4. import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
  5. import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.web.bind.annotation.GetMapping;
  9. import org.springframework.web.bind.annotation.PathVariable;
  10. import org.springframework.web.bind.annotation.RequestMapping;
  11. import org.springframework.web.bind.annotation.RestController;
  12. import java.util.Date;
  13. /**
  14. * Goods Controller 服务提供方
  15. */
  16. @RestController
  17. @RequestMapping("/goods")
  18. public class GoodsController {
  19. @Autowired
  20. private GoodsService goodsService;
  21. @Value("${server.port}")
  22. private int port;
  23. /**
  24. * 降级:
  25. * 1. 出现异常
  26. * 2. 服务调用超时
  27. * * 默认1s超时
  28. *
  29. * @HystrixCommand(fallbackMethod = "findOne_fallback")
  30. * fallbackMethod:指定降级后调用的方法名称
  31. */
  32. @GetMapping("/findOne/{id}")
  33. @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {
  34. //设置Hystrix的超时时间,默认1s
  35. @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000"),
  36. //监控时间 默认5000 毫秒
  37. @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),
  38. //失败次数。默认20次
  39. @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "20"),
  40. //失败率 默认50%
  41. @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50") })
  42. public Goods findOne(@PathVariable("id") int id){
  43. //如果id == 1 ,则出现异常,id != 1 则正常访问
  44. if(id == 1){
  45. //1.造个异常
  46. int i = 3/0;
  47. }
  48. /*try {
  49. //2. 休眠2秒
  50. Thread.sleep(2000);
  51. } catch (InterruptedException e) {
  52. e.printStackTrace();
  53. }*/
  54. Goods goods = goodsService.findOne(id);
  55. goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上
  56. return goods;
  57. }
  58. /**
  59. * 定义降级方法:
  60. * 1. 方法的返回值需要和原方法一样
  61. * 2. 方法的参数需要和原方法一样
  62. */
  63. public Goods findOne_fallback(int id){
  64. Goods goods = new Goods();
  65. goods.setTitle("降级了~~~");
  66. return goods;
  67. }
  68. }

3.3.3-熔断监控

• Hystrix 提供了 Hystrix-dashboard 功能,用于实时监控微服务运行状态。
• 但是Hystrix-dashboard只能监控一个微服务。
• Netflix 还提供了 Turbine ,进行聚合监控。
1587544649322.png

熔断器监控安装 请查看Turbine搭建步骤.md

1587544516031.png