• 第十六节--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();
    }
    
    }
    第四步:服务端不停,让对应的线程睡眠,测试访问
     
     
     
     
     
     服务端停止宕机,同样是一样的结果
     
     
     
     
     
     
     
     
  • 相关阅读:
    买房的贷款时间是否是越长越好?https://www.zhihu.com/question/20842791
    asp.net cookie and session
    leelazero and google colab
    download file by python in google colab
    physical processor, core, logical processor
    通过powershell操作eventlog
    openxml in sql server
    get the page name from url
    How to Execute Page_Load() in Page's Base Class?
    Difference between HttpContext.Request and Request
  • 原文地址:https://www.cnblogs.com/hexublog/p/13681879.html
Copyright © 2020-2023  润新知