第十六节--Hystrix之服务降级全局配置

在上一节存在的问题:每个业务方法对象一个兜底的方法,代码膨胀,不可能每个方法都要一个处理异常的方法对应
使用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();
}

}
第四步:服务端不停,让对应的线程睡眠,测试访问
 
 
 
 
 
 服务端停止宕机,同样是一样的结果
 
 
 
 
 
 
 
 

 

 

 

posted @ 2020-09-16 22:35  hexu_blog  阅读(1102)  评论(0编辑  收藏  举报