Hystrix服务降级fallback实现
花开堪折直需折,莫待无花空折枝
- 我是一个菜菜鸟
Hystrix服务降级介绍:
- 当某个服务接口出现异常情况时(超时、执行异常)——该接口不可用,此时需要及时进行异常情况的处理,避免出现级联故障导致服务雪崩的现象,需要使用一个备选方案来实现服务的及时响应;(就好比if else if…else中的else一层,有一个备用方案)
服务降级fallback实现:
-
服务降级在服务端、客户端都可以,但一般放在客户端;如果客户端配置过feign,可在配置文件中加入(不过不在feign中开启也是没有问题的):
feign: hystrix: enabled: true
-
实现步骤:
- 主启动类加上@EnableCircuitBreaker
@SpringBootApplication @EnableEurekaClient @EnableCircuitBreaker//开启断路器 public class PaymentHystrixMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentHystrixMain8001.class,args); } }
- 在Controller中使用@HystrixCommand配置服务降级,并使用fallbackMethod指定服务降级执行的方法,以及使用@HystrixProperty配置触发hystirx服务降级的条件;
//配置fallback服务降级执行的方法,并配置默认等待时间为执行3秒以内,这里故意设置睡嘛五秒,触发服务降级 //当该接口执行出现错误时,使用fallbackMethod中的方法来进行服务降级(即执行fallbackMethod中的方法) @HystrixCommand(fallbackMethod = "paymentInfoTimeOutHandler",commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000") }) public String paymentInfoTimeOut(int id) { int timeOut=5;//设置睡眠时间为五秒,触发fallbackMethod服务降级 try { TimeUnit.SECONDS.sleep(timeOut); } catch (InterruptedException e) { e.printStackTrace(); } return "线程池"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id"+id+"\t"+"休眠"+timeOut+"秒钟"; } public String paymentInfoTimeOutHandler(int id){ return "客户端接口超时或异常\t线程池:"+Thread.currentThread().getName(); }
-
服务降级fallback到这里简单配置实现就🆗了,接下来就是访问对应的接口就可以了,我这里是“http://localhost:85/consumer/payment/hystrix/fallback/2”:可以看到虽然上面睡眠了五秒钟,正常情况下将会返回一个超时异常,而这里由于配置hystrix的服务降级,在发生异常时不会返回一个错误页面而是自己设置的服务降级的方法的返回内容。