开发者

Spring Cloud Hystrix 服务降级限流策略详解

开发者 https://www.devze.com 2023-01-04 10:36 出处:网络 作者: Lxlxxx
目录前言Hystrix简介Hystrix的使用服务降级system服务控制层System2调System降级场景服务熔断总结前言
目录
  • 前言
  • Hystrix简介
  • Hystrix的使用
    • 服务降级
    • system服务控制层
    • System2调System降级场景
  • 服务熔断
    • 总结

      前言

      前面说到在我们应对高并发的场景,请求量过于大的情况下给我们服务器的压力很多,造成缓存穿透、击穿、雪崩,那么我们采用布隆过滤器,有兴趣的小伙伴可以去看看上篇文章,关于布隆过滤器的解析。Redis处理高并发之布隆过滤器

      我们要从根源上解决问题,比如一个接口在同一时间内被多次请求,如果请求失败了,我们还要继续请求么,一直请求一直失败,一直的在给我们的服务器施加压力,这种情况下肯定是不行,这个时候我们就需要对接口服务提供降级策略,在服务请求达成一定失败率的情况下,就触发降级、熔断策略对服务进行保护,也可以去服务的每分钟请求次数做限制,从而保护我们的服务,给服务端减轻压力,可ztooE以更http://www.devze.com加效率去执行业务逻辑。

      Hystrix简介

      Hystrix 是一个用于解决分布式服务调用出现延迟、故障,在一个服务出现故障的时候,保护其他服务可以正常使用,避免整个系统出现问题,Hystrix作为开源库,以断路器的角色存在着。

      Hystrix的使用

      服务降级

      服务超时或故障,Hystrix调用降级方法处理,首先构建两个服务,一个system服务,定义2个controller方法,一个是模拟超时的场景,一个模拟调用错误的场景,另外一个system2的服务,去模拟分布式场景下的调system服务的场景。

      Spring Cloud Hystrix 服务降级限流策略详解

      system服务控制层

      @RestController
      @RequestMapping("/hystrix")
      @DefaultProperties(defaultFallback = "timeOutFallbackMethod")
      public class HystrixController {
          @Autowired
          private IHystrixService iHystrixService;
          @GetMapping("/error")
          @HystrixCommand
          public String errorMethod() {
              int i = 10 / 0;
              return iHystrixService.fallBackMethodOk();
          }
          @GetMapping("/timeOut")
          @HystrixCommand(fallbackMethod = "timeOutFallbackMethod", commandProperties = {
                  //超过2秒及服务降级
                  @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000")
          })
          public String timeOutMethod() throws InterruptedException {
              //线程睡眠3秒
              return iHystrixService.timeOutMethod();
          }
          /**
           * 降级方法
           *
           * @return
           */
          private String timeOutFallbackMethod() {
              return "服务访问失败,降级处理";
          }
      }
      

      @DefaultphpProperties 默认全局降级方法,在单纯只加@HystrixCommand注解的情况下,走默认的defaultFallba开发者_C培训ck方法。

      int i = 10 / 0; 接口异常情况下降级

      Spring Cloud Hystrix 服务降级限流策略详解

      超时降级,服务设置超时时间为2秒,调用线程睡眠3秒,超时调降级服务

      Spring Cloud Hystrix 服务降级限流策略详解

      Spring Cloud Hystrix 服务降级限流策略详解

      System2调System降级场景

      controller

      @RestController
      @AllArgsConstructor
      @RequestMapping("/provider")
      public class HystrixProviderController {
          @Autowired
          private HystrixService hystrixService;
          /**
           * 模拟接口错误场景
           * @return
           */
          @GetMapping("/executeProviderMethod1")
          public String executeProviderMethod1(){
              int i =5/0;
              String result = hystrixService.errorMethod();
              return result;
          }
      }
      

      服务system feign接口,feign添加fallback,实现类是调用的降级方法。

      @FeignClient(contextId = "hystrixService", value = "Lxlxxx-system", fallbackFactory = HystrixFallbackFactory.class)
      public interface HystrixService {
          /**
           * 异常方法
           *
           * @return
           */
          @GetMapping("/hystrix/error")
          public String errorMethod();
          /**
           * 超时方法
           *
           * @return
           */
          @GetMapping("/hystrix/timeOut")
          public String timeOutMethod();
      }
      

      fallback降级方法。

      @Component
      @Slf4j
      public class HystrixFallbackFactory implements FallbackFactory<HystrixService> {
          @Override
          public HystrixService create(Throwable cause) {
              log.error("用户服务调用失败:{}", cause.getMessage());
              return new HystrixService() {
                  @Override
                  public String errorMethod() {
                      return "触发system 服务的降级方法";
                  }
                  @Override
                  public String timeOutMethod() {
                      return null;
                  }
              };
          }
      }
      

      服务熔断

      Service类里面的熔断方式,可以配置多个出发服务熔断的属性,从而更好的断路保护服务。

      @Service
      @Slf4j
      public class HystrixServiceImpl implements IHystrixService {
          //服务熔断
          @HystrixCommand(fallbackMethod = "fallback",commandProperties = {
                  @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),  //是否开启断路器
                  @HystrztooEixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "5"),   //请求次数
                  @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),  //时间范围
                  @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"), //失败率达到多少后跳闸
          })
          @Override
          public String countError(Integer count){
              //模拟报错
              if (count > 0){
                  throw new RuntimeException("*****count 必须大于0");
              }
              return Thread.currentThread(js).getName()+"\t"+"调用成功";
          }
          public String fallback(Integer count){
              return "count 必修大于0    count: " +count;
          }
      }
      

      总结

      熔断、降级的方式有很多,Spring Cloud Hystrix 可以能更好的集成在分布式微服务的架构体系上,采用注解的方式,更加方便使用,如果还有更好的服务熔断、降级策略欢迎小伙伴分享。

      以上就是Spring Cloud Hystrix 服务降级限流策略详解的详细内容,更多关于Spring Cloud Hystrix 服务降级限流的资料请关注我们其它相关文章!

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      关注公众号