一、原理:
一个单体服务,拆成多个微服务A、B、C,一切正常的时候还好,万一A有个功能需要调用B的方法,
B的这个方法又要调用C的方法。这个时候C出幺蛾子了,B一直请求不到C就没办法返回结果,A又不断的在请求B。
这个时候就会耗尽资源,导致整个系统崩溃掉,就是所谓的雪崩效应。
那么有什么防止措施吗?那就用Hystrix服务降级和熔断吧。
这东西听起来好像有点高级,其实说白了,
熔断就是请求一个服务的时候, 如果多次请求都还是请求失败,那么就让后面的不要再请求了。
降级就是,请求在规定时间内还没有返回结果的话,就执行另外一个方法(用于快速返回结果,不要一直堵在那里!)
二、实现:
1、pom引入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
2、启动类引入注解:
@EnableCircuitBreaker:用于启动熔断功能(就和断路器差不多,压力大了就不干了,关掉,免得失火)
3、yml配置:
#feign: # hystrix: # enabled: true #hystrix: # command: # default: # execution: # isolation: # thread: # timeoutInMilliseconds: 10000 #超时时间 # circuitBreaker: # requestVolumeThreshold: 10 #超时时间内,多少个请求失败后,打开断路器 # sleepWindowInMilliseconds: 5000 #打开短路器后,多少秒开始尝试恢复 # errorThresholdPercentage: 50 #在滚动时间内,失败频率达到百分之50,就打开断路器 # metrics: # rollingStats: # timeInMilliseconds: 10000 #设置滚动时间,10000ms,就是在这个时间内, #requestVolumeThreshold: 10,有10次请求。 #失败率是 errorThresholdPercentage: 50,百分之50,就打开断路器。
4、代码:
1、通过@HystrixCommand来实现退回机制:
@HystrixCommand(fallbackMethod = "fallback")
@GetMapping("/postRestTemplateRibbonConsumer")
public String postRestTemplateRibbonConsumer(){
Map<String,String> paramMap = new HashMap();
paramMap.put("start", "1");
paramMap.put("page", "5");
return this.restTemplateRibbon.postForObject("http://eureka-client/"+"/postDcRequestBody",paramMap,String.class);
}
public String fallback() {
return "fallback";
}
2、通过@FeignClient(value =“eureka-client”,fallback = FeignFallBack.class),指定退回类,实现退回机制:
- 定义一个Feign接口:
@FeignClient(value ="eureka-client",fallback = FeignFallBack.class)
public interface FeignInterface {
@PostMapping("/postDcRequestBody")
public String postDcRequestBody(@RequestBody Map<String,String> paramMap);
@PostMapping("/postFeignClientConsumerHystrix")
public String postFeignClientConsumerHystrix();
}
- 创建一个FeignFallBack,实现接口:
@Component
public class FeignFallBack implements FeignInterface {
@Override
public String postDcRequestBody(Map<String, String> paramMap) {
return "调用postDcRequestBody失败!";
}
@Override
public String postFeignClientConsumerHystrix() {
return "调用postFeignClientConsumerHystrix失败!";
}
}
- 调用接口方法:
/**
* post请求(Feign接口)
* @return
*/
@GetMapping("/postFeignClientConsumer")
public String postFeignClientConsumer(){
Map<String,String> paramMap = new HashMap();
paramMap.put("start", "1");
paramMap.put("page", "5");
return this.feignInterface.postDcRequestBody(paramMap);
}
说明:方法请求,在规定的时间内,没有返回,就触发降级,执行对应的降级方法。