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@EnableCircuitBreakerpublic 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 {@Autowiredprivate 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 {@Autowiredprivate 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 "本消息来自于统一服务降级处理方法";}}
修改内容:
- 添加统一的服务降级处理方法,该方法返回值应该与所有原方法一致,并保证参数列表为空
- 移除方法指定的服务降级处理方法
- 给类添加统一的服务降级处理方法
