这三种方式是配置在服务调用方的controller中(也就是Hystrix在客户端),当然Hystrix也可以配置在服务提供方。
1.首先定义一个controller:
@RestController public class OrderHystrixController { @Resource private PaymentHystrixService paymentHystrixService; @GetMapping("/consumer/payment/hystrix/timeout/{id}") @HystrixCommand(fallbackMethod ="paymentTimeoutFallbackMethod",commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500") }) public String paymentInfo_timeout(@PathVariable("id") Integer id){ return paymentHystrixService.paymentInfo_timeout(id); } public String paymentTimeoutFallbackMethod(@PathVariable("id") Integer id){ return "对方支付系统繁忙中或者检查自己是否出错!!!😭--id"+id; } }2.解释:在paymentInfo_timeout方法上使用@HystrixCommand注解,其中fallbackMethod表示配置服务降级后需要执行的方法,如下所示:
public String paymentTimeoutFallbackMethod(@PathVariable("id") Integer id){ return "对方支付系统繁忙中或者检查自己是否出错!!!😭--id"+id; }3.注意:这种方式将业务方法和降级方法放在一起,耦合度高(可能一个方法,就会对应一个服务降级方法),不推荐使用!!!
1.定义一个controller:
@RestController @DefaultProperties(defaultFallback = "globalErrorHandler") public class OrderHystrixController { @Resource private PaymentHystrixService paymentHystrixService; @GetMapping("/consumer/payment/hystrix/timeout/{id}") @HystrixCommand public String paymentInfo_timeout(@PathVariable("id") Integer id){ return paymentHystrixService.paymentInfo_timeout(id); } public String globalErrorHandler(){ return "系统出错啦,请稍后再试!!!"; } }2.解释:这种方式也需要使用@HystrixCommand注解,不过不用配置相关的属性,其次使用@DefaultProperties注解并标注在这个controller上,其中defaultFallback用于配置全局服务降级后需要执行的方法,如下所示:
public String globalErrorHandler(){ return "系统出错啦,请稍后再试!!!"; }3.注意:只要方法上标注了@HystrixCommand注解,那么这个方法就会去找这个全局服务降级方法(即globalErrorHandler()方法),这种方式相比于第一种方式耦合度虽然降低,但还是不推荐使用!!!
1.定义一个由@FeignClient标注的接口,如下所示:
@Component @FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentHystrixServiceImpl.class) public interface PaymentHystrixService { @GetMapping("/payment/hystrix/ok/{id}") public String paymentInfo_Ok(@PathVariable("id") Integer id); @GetMapping("/payment/hystrix/timeout/{id}") public String paymentInfo_timeout(@PathVariable("id") Integer id); }2.然后再定义一个这个接口的实现类,如下所示:
@Component /** 在这个实现类中可以配置服务被降级后需要执行的方法 */ public class PaymentHystrixServiceImpl implements PaymentHystrixService { @Override public String paymentInfo_Ok(Integer id) { return "--------service error"; } @Override public String paymentInfo_timeout(Integer id) { return "--------service error"; } }3.解释:在@FeignClient中配置属性fallback,这个属性的属性值是由@FeignClient注解标注的接口的实现类,在这里是PaymentHystrixServiceImpl.class,这种方式强烈推荐!!!