返回顶部

服务降级,controller设置服务降级的超时时间无效?

服务调用出现的问题

  • 服务A——>H——>I——>P调用,如果I服务超时,将导致请求全部积压在H服务,导致占用系统资源,引发“雪崩效应”。

解决办法:Hystrix Defend Your App

  • Hystrix是处理分布式系统的延迟和容错的开源库。在分布式系统中,许多依赖会调用失败,超时、异常等,Hystrix能够保证在一个依赖出现问题时,不会导致整体服务失败,避免级联故障,提高系统弹性。
  • 断路器:当某个服务出现故障,通过断路器的故障监控,像调用方返回一个符合预期的、可处理的备选响应(Fallback),而不是长时间等待或者抛出无法处理的异常。

Hystrix 简单使用

  • 服务降级Fallback:服务出现问题,不会让用户等待,也不会调用出问题的服务,而是调用降级方法,返回友好提示。
    • 什么情况会出现
      • 运行异常
      • 超时
      • 服务熔断触发
      • 线程池打满
  • 服务熔断Break:直接拒绝访问,调用服务降级方法返回友好提示。
  • 服务限流Flowlimit:秒杀高并发操作,控制流量。

服务降级入门案例

  • 在服务消费方的 controller 层服务降级
<!--hystrix 依赖-->
       <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
       </dependency>

//方法注解 @HystrixCommand
//超时时间设置 @HystrixProperty
@HystrixCommand(fallbackMethod = "okMessageFallbackMethod",commandProperties = {
           @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000")
   })
   public String okMessage(){
       return paymentHystrixService.okMessage();
   }

   public String okMessageFallbackMethod(){
       return "我是消费者80,对方支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
   }

  • 每个方法都设置服务降级方法不合理,可以使用全局降级方法。
//类注解  @DefaultProperties
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
// 下面是全局fallback方法
    public String payment_Global_FallbackMethod()
    {
        return "Global异常处理信息,请稍后再试,/(ㄒoㄒ)/~~";
    }

controller设置服务降级的超时时间无效

  • 服务提供方模拟超时3秒钟,消费方设置超时时间5秒@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000"),按照逻辑应该是调用成功,但是浏览器返回降级方法内容。
  • 解决办法说明:消费方service层使用openFeign调用服务默认超时时间1秒,而服务提供方模拟超时3秒钟,导致服务调用失败,所以controller设置服务降级的超时时间无效。
//feign集成ribbon,设置ribbon超时时间
ribbon:
  ReadTimeout: 5000
  ConnectTimeout: 5000

feign接口实现服务降级

#feign开启hystrix
feign:
  hystrix:
    enabled: true

//实现feign接口,重写方法,这就是服务降级的方法
@Component
public class PaymentHystrixServiceFallback implements PaymentHystrixService {
    @Override
    public String okMessage() {
        return "PaymentHystrixService fallback /(ㄒoㄒ)/~~";
    }
}

//feign接口注解
@FeignClient(value = "CLOUD-PAYMENT-SERVICE",fallback = PaymentHystrixServiceFallback.class)
  • feign接口服务降级超时问题
    在于feign:hystrix:enabled: true的作用,官网解释“Feign将使用断路器包装所有方法”,也就是将@FeignClient标记的service接口下所有的方法进行了hystrix包装(类似于在这些方法上加了一个@HystrixCommand),这些方法默认的服务降级超时时间为1s。而服务提供方模拟超时3秒钟,导致服务调用失败,直接进入实现类服务降级方法。

  • 解决办法,yml文件配置

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000
  • 配置文件这里的 timeoutInMilliseconds 并不是覆盖注解中的设置,而是两者取较低值,同时也会算上 ribbon: ReadTimeout 的值,也就是三者取最低值。
posted @ 2021-11-11 22:06  凑数的园丁  阅读(433)  评论(0编辑  收藏  举报