• 第十六节--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();
    }
    
    }
    第四步:服务端不停,让对应的线程睡眠,测试访问
     
     
     
     
     
     服务端停止宕机,同样是一样的结果
     
     
     
     
     
     
     
     
  • 相关阅读:
    预警|使用方维、微吼等系统直播平台警惕黑客攻击
    常用的商业级和免费开源Web漏洞扫描工具
    现身说法:面对DDoS攻击时该如何防御?
    修改数据库插入默认日期
    SQL Server中Rowcount与@@Rowcount的用法 和set nocount on 也会更新@@Rowcount
    sql存储过程异常捕获并输出例子还有不输出过程里面判断异常 例子
    delphi 判断一个数组的长度用 Length 还是 SizeOf ?
    object_id用法
    SqlServer try catch 捕获不到的一些错误及解决方法(转载)
    sql rank()函数
  • 原文地址:https://www.cnblogs.com/hexublog/p/13681879.html
Copyright © 2020-2023  润新知