如何解决因在某一时刻大量线程同时访问接口(高并发)而导致的接口堵死的情况?

降级/容错/限流技术来解决。

什么情况会导致服务降级?

程序运行异常/超时/服务熔断触发降级/线程池、信号量打满也会导致服务降级

什么情况会导致服务熔断?

达到最大服务访问量后,直接拒绝访问,开始调用服务降级的方法并返回友好提示,并在检测到该节点的微服务调用响应正常后,恢复调用链路(与降级的区别)。

什么情况会导致服务限流?

  1. to be answer...

如何进行服务降级?

PS:一般做服务降级是放在调用方
Hystrix/…

  • [x] 服务方:(一般不在服务方式用服务降级)

    Hystrix:
    超时/运行异常的做法:

    1. 设置自身调用超时时间的峰值,峰值内可以正常工作,超过时间需要兜底,做服务降级fallback(备选响应)。
    2. 为方法加上@HystrixCommand注解,fallbackMethod设定fallback函数,commandProperties结合@HystrixProperty可以设定运行时间峰值。
    3. 主启动类加上@EnableCircuitBreaker来使能@HystrixCommand注解。
  • [x] 调用方:

       Hystrix:
    
    1. yml文件增加hystix使能配置:feign.hystrix.enabled: true
    2. 主启动类增加@EnableHystrix注解
    3. 方法增加@HystrixCommand注解,fallbackMethod设定fallback函数,commandProperties结合@HystrixProperty可以设定运行时间峰值。
    4. 增加相应的fallback函数
    5. 每一个函数都要加一个fallback,太冗余了,因此整一个全局fallback,在类上加一个@DefaultProperties(defaultFallback = “”),方法上仅采用@HystrixCommand注解即可。
    6. 对于特定的fallback,在服务接口处的@FeignClient增加fallback = 相应的接口实现类,该类种包含了特定的fallback处理方式

      如何进行服务熔断?

      与服务降级基本一致,在(3)处有配置不同:
      //服务熔断
      @HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback", commandProperties = {
      @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //``是否开启断路器
      @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //``请求次数
      @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //``时间窗口期
      @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), //``失败率达到多少后跳闸
      })
      public String paymentCircuitBreaker(@PathVariable("id") Integer id) {}