在上一节存在的问题:每个业务方法对象一个兜底的方法,代码膨胀,不可能每个方法都要一个处理异常的方法对应
使用global fallback全局配置
第一步:在类上使用@DefaultProperties注解,指定异常或超时等服务降级的方法 @RestController @Slf4j @DefaultProperties(defaultFallback = "timeoutGlobleHandler")//当使用hystrix服务降级时,没有指定对应的方法,就来找到全局的服务降级对应方法 public class OrderController { 第二步:编写处理方法 //全局配置降级方法 public CommonResult timeoutGlobleHandler(){ return new CommonResult(400,"全局消费端服务正忙,请稍后再试"); } 第三步:在需要降级的目标方法使用注解@HystrixCommand,当该方法出现错误时就会自动去找到降级处理的方法 @HystrixCommand @GetMapping("/consumer/findPaymentList") public CommonResult findPaymentList(){ log.info("查询所有数据"); return orderService.findPaymentList(); }
但是之前每个对应方法指定的目标降级方法必须删除掉或注释掉,否则会发生冲突
/* @HystrixCommand(fallbackMethod ="timeoutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
})*/必须注释掉
第四步:测试即可
但实际上不推荐使用在controller层上使用注解,我们直接定义一个类集成我们所需要调用的接口即可,方便管理
在工作中会遇上的问题无非三种:异常,超时,宕机
第一步:定义一个类OrderServiceFallback实现接口OrderService @Component public class OrderServiceFallback implements OrderService { @Override public CommonResult addPayment(Payment payment) { return new CommonResult(400,"添加方法服务正忙,请稍后再试"); } @Override public CommonResult findPaymentById(Long id) { return new CommonResult(400,"根据Id查找方法服务正忙,请稍后再试"); } @Override public CommonResult findPaymentList() { return new CommonResult(400,"查询列表方法服务正忙,请稍后再试"); } } 第二步:在OrderService上使用fallback指定宕机或延时加载或异常指定的类fallback = OrderServiceFallback.class @Component @FeignClient(value = "cloud-hystrix-payment-service",fallback = OrderServiceFallback.class) //指定为服务名称 public interface OrderService { 第三步:controller类,不能再方法和controller类上使用注解@DefaultProperties和@HystrixCommand @RestController @Slf4j public class OrderController { @Autowired private OrderService orderService; @PostMapping("/consumer/addPayment") public CommonResult addPayment(Payment payment){ return orderService.addPayment(payment); } @GetMapping("/consumer/findPaymentById/{id}") public CommonResult findPaymentById(@PathVariable("id")Long id){ log.info("消费端查找数据"); return orderService.findPaymentById(id); } @GetMapping("/consumer/findPaymentList") public CommonResult findPaymentList(){ log.info("查询所有数据"); return orderService.findPaymentList(); } }
第四步:服务端不停,让对应的线程睡眠,测试访问
服务端停止宕机,同样是一样的结果