一、原理:
一个单体服务,拆成多个微服务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); }
说明:方法请求,在规定的时间内,没有返回,就触发降级,执行对应的降级方法。