SpringCloud从入门到精通(六)

Hystrix-熔断器

Hystrix-概述

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

Hystix 主要功能

隔离
        线程池隔离
        信号量隔离
降级 : 异常,超时
熔断
限流
SpringCloud从入门到精通(六)_第1张图片

 

SpringCloud从入门到精通(六)_第2张图片


Hystrix-降级

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

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



  org.springframework.cloud
  spring-cloud-starter-netflix-hystrix
2. 定义降级方法
/**
* 定义降级方法:
* 1. 方法的返回值需要和原方法一样
* 2. 方法的参数需要和原方法一样
*/
public Goods findOne_fallback(int id){
  Goods goods = new Goods();
  goods.setTitle("降级了~~~");
  return goods;
}
3. 使用 @HystrixCommand 注解配置降级方法
/**
* 降级:
* 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;
}
4. 在启动类上开启 Hystrix 功能: @EnableCircuitBreaker
/**
* 启动类
*/
@EnableEurekaClient //该注解 在新版本中可以省略
@SpringBootApplication
@EnableCircuitBreaker // 开启Hystrix功能
public class ProviderApp {
  public static void main(String[] args) {
    SpringApplication.run(ProviderApp.class,args);
  }
}
消费方降级
1. feign 组件已经集成了 hystrix 组件。
2. 定义 feign 调用接口实现类,复写方法,即降级方法
/**
* 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;
  }
}
3. @FeignClient 注解中使用 fallback 属性设置降级处理类。
GoodsFeignClient
@FeignClient(value = "HYSTRIX-PROVIDER",fallback =
GoodsFeignClientFallback.class)
public interface GoodsFeignClient {
  @GetMapping("/goods/findOne/{id}")
  public Goods findGoodsById(@PathVariable("id") int id);
}
4. 配置开启 feign.hystrix.enabled = true
application.yml
# 开启feign对hystrix的支持
feign:
  hystrix:
    enabled: true

Hystrix-熔断

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

SpringCloud从入门到精通(六)_第3张图片 熔断-代码演示

修改服务提供方的方法,演示熔断机制
熔断配置
• circuitBreaker.sleepWindowInMilliseconds :监控时间
• circuitBreaker.requestVolumeThreshold :失败次数
• circuitBreaker.errorThresholdPercentage :失败率

GoodsController
@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"),
  //监控时间 默认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;
  }
  /**
  * 定义降级方法:
  * 1. 方法的返回值需要和原方法一样
  * 2. 方法的参数需要和原方法一样
  */
  public Goods findOne_fallback(int id){
    Goods goods = new Goods();
    goods.setTitle("降级了~~~");
    return goods;
  }
}
熔断监控
• Hystrix 提供了 Hystrix-dashboard 功能,用于实时监控微服务运行状态。
但是 Hystrix-dashboard 只能监控一个微服务。
• Netflix 还提供了 Turbine ,进行聚合监控。

SpringCloud从入门到精通(六)_第4张图片

 SpringCloud从入门到精通(六)_第5张图片

 

你可能感兴趣的:(SpringCloud,spring,cloud,分布式,spring,boot)