title: SpringCloud学习笔记五:Hystrix
date: 2020-04-30 16:17:03
tags:

  • SpringCloud
  • Hystrix
    categories: SpringCloud
    toc_number: true

Hystrix实现了对restTemplate与Feigin的支持。
Hystrix功能:

  1. 调用熔断

对于Hystrix的支持,只需要针对消费者(调用方)修改即可。

添加依赖

在消费者中添加Hystrix的依赖:

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  4. </dependency>

添加注解

在启动类添加@EnableCircuitBreaker,然后配置RestTemplate以备远程调用。

  1. @EnableEurekaClient
  2. @SpringBootApplication
  3. @EnableCircuitBreaker
  4. public class EurekaConsumerApplication1 {
  5. @LoadBalanced
  6. @Bean(value = "restTemplate")
  7. public RestTemplate restTemplate() {
  8. return new RestTemplate();
  9. }
  10. public static void main(String[] args) {
  11. SpringApplication.run(EurekaConsumerApplication1.class, args);
  12. }
  13. }

添加程端调用

  1. @RestController
  2. @RequestMapping(value = "/api/consumer")
  3. public class IndexController {
  4. @Autowired
  5. private RestTemplate restTemplate;
  6. @HystrixCommand(fallbackMethod = "getMsgFallBack")
  7. @GetMapping(value = "/getRemoteMsg")
  8. public String remoteIndexController() {
  9. return restTemplate.getForObject("http://MICRO-PRODUCER/api/index/getMsg", String.class);
  10. }
  11. public String getMsgFallBack() {
  12. return "本消息来自于服务降级处理方法!";
  13. }
  14. }

其中,@HystrixCommand用以指定熔断时的服务降级处理方法。服务降级处理方法的参数列表及返回值类型应与原方法一致。

生产者(服务提供者)代码省略,最简单的测试方法是关闭服务提供者,查看消费者的远程调用是否返回服务降级处理方法的内容。

查看源码,涉及服务为eureka-consumer1->eureka-server0->eureka-producer0

@HystrixCommand注解的属性说明如下

  • groupKey:设定HystrixCommand分组的名称。
  • commandKey:设定HystrixCommand的名称。
  • threadPoolKey:设定HystrixCommand执行线程池的名称。
  • fallbackMethod:设定HystrixCommand服务降级所使用的方法名称,注意该方法需要与主方法定义在同一个类中,并且方法签名也要一致。
  • commandProperties:设定HystrixCommand属性,比如,断路器失败百分比、断路器时间窗口大小等,具体属性可以参考后面的讲解。
  • threadPoolProperties:设定HystrixCommand所执行线程池的属性,比如,线程池的大小、线程池等待队列长度等。
  • ignoreExceptions:设定HystrixCommand执行服务降级处理时需要忽略的异常,也就是当出现这些异常时不会执行服务降级处理。
  • observableExecutionMode:设定HystrixCommand执行的方式。
  • defaultFallback:设定HystrixCommand默认的服务降级处理方法,如同时设定了fallbackMethod,会优先使用fallbackMethod所指定的方法。这里还需要说明的一点是该属性所指定的方法没有参数,所以需要注意以下返回值与主方法返回值的兼容性。

添加类中的统一服务降级处理方法

为应对多个方法需要触发熔断机制,可以提供统一服务降级处理方法。其代码如下:

  1. @RestController
  2. @RequestMapping(value = "/api/consumer")
  3. @DefaultProperties(defaultFallback = "defaultFallBack")
  4. public class IndexController {
  5. @Autowired
  6. private RestTemplate restTemplate;
  7. @HystrixCommand //(fallbackMethod = "getMsgFallBack")
  8. @GetMapping(value = "/getRemoteMsg")
  9. public String remoteIndexController() {
  10. return restTemplate.getForObject("http://MICRO-PRODUCER/api/index/getMsg", String.class);
  11. }
  12. public String getMsgFallBack() {
  13. return "本消息来自于服务降级处理方法!";
  14. }
  15. public String defaultFallBack(){
  16. return "本消息来自于统一服务降级处理方法";
  17. }
  18. }

修改内容:

  1. 添加统一的服务降级处理方法,该方法返回值应该与所有原方法一致,并保证参数列表为空
  2. 移除方法指定的服务降级处理方法
  3. 给类添加统一的服务降级处理方法