title: SpringCloud学习笔记五:Hystrix
date: 2020-04-30 16:17:03
tags:
- SpringCloud
- Hystrix
categories: SpringCloud
toc_number: true
Hystrix实现了对restTemplate与Feigin的支持。
Hystrix功能:
- 调用熔断
对于Hystrix的支持,只需要针对消费者(调用方)修改即可。
添加依赖
在消费者中添加Hystrix的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
添加注解
在启动类添加@EnableCircuitBreaker
,然后配置RestTemplate以备远程调用。
@EnableEurekaClient
@SpringBootApplication
@EnableCircuitBreaker
public class EurekaConsumerApplication1 {
@LoadBalanced
@Bean(value = "restTemplate")
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(EurekaConsumerApplication1.class, args);
}
}
添加程端调用
@RestController
@RequestMapping(value = "/api/consumer")
public class IndexController {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "getMsgFallBack")
@GetMapping(value = "/getRemoteMsg")
public String remoteIndexController() {
return restTemplate.getForObject("http://MICRO-PRODUCER/api/index/getMsg", String.class);
}
public String getMsgFallBack() {
return "本消息来自于服务降级处理方法!";
}
}
其中,@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所指定的方法。这里还需要说明的一点是该属性所指定的方法没有参数,所以需要注意以下返回值与主方法返回值的兼容性。
添加类中的统一服务降级处理方法
为应对多个方法需要触发熔断机制,可以提供统一服务降级处理方法。其代码如下:
@RestController
@RequestMapping(value = "/api/consumer")
@DefaultProperties(defaultFallback = "defaultFallBack")
public class IndexController {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand //(fallbackMethod = "getMsgFallBack")
@GetMapping(value = "/getRemoteMsg")
public String remoteIndexController() {
return restTemplate.getForObject("http://MICRO-PRODUCER/api/index/getMsg", String.class);
}
public String getMsgFallBack() {
return "本消息来自于服务降级处理方法!";
}
public String defaultFallBack(){
return "本消息来自于统一服务降级处理方法";
}
}
修改内容:
- 添加统一的服务降级处理方法,该方法返回值应该与所有原方法一致,并保证参数列表为空
- 移除方法指定的服务降级处理方法
- 给类添加统一的服务降级处理方法