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

作者:Lxlxxx 时间:2022-05-02 15:20:27 

前言

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

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

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 "服务访问失败,降级处理";
   }
}

@DefaultProperties 默认全局降级方法,在单纯只加@HystrixCommand注解的情况下,走默认的defaultFallback方法。

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"),  //是否开启断路器
           @HystrixProperty(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().getName()+"\t"+"调用成功";
   }
   public String fallback(Integer count){
       return "count 必修大于0    count: " +count;
   }
}

来源:https://juejin.cn/post/7182960606201266235

标签:Spring,Cloud,Hystrix,服务降级,限流
0
投稿

猜你喜欢

  • 解决mybatis-generator生成器添加类注释方法无效的问题

    2023-12-05 06:34:57
  • Java常用内置注解用法分析

    2023-11-24 04:53:46
  • java源码解析之String类的compareTo(String otherString)方法

    2023-11-11 23:10:00
  • 浅谈springioc实例化bean的三个方法

    2022-05-18 08:37:56
  • Java Vector实现班级信息管理系统

    2023-11-25 03:09:09
  • 浅谈JAVA设计模式之享元模式

    2021-09-22 10:12:06
  • SpringBoot如何返回Json数据格式

    2023-01-12 16:28:51
  • Java单例模式下的MongoDB数据库操作工具类

    2023-11-20 12:55:01
  • SpringBoot实现Excel文件批量上传导入数据库

    2023-11-29 11:13:44
  • Unicode、UTF-8 和 ISO8859-1区别解析

    2021-06-02 07:45:57
  • SpringCloud Gateway HttpWebHandlerAdapter链路调用请求流程介绍

    2023-04-29 00:12:18
  • Spring之spring-context-indexer依赖详解

    2023-11-23 12:21:41
  • idea全局搜索快捷键超详细总结(推荐!)

    2021-08-12 20:16:18
  • Java7和Java8中的ConcurrentHashMap原理解析

    2022-06-09 22:06:28
  • java_object的简单使用详解

    2023-08-22 11:35:57
  • Android中外接键盘的检测的实现

    2023-07-27 21:15:13
  • 详解springboot之jackson的两种配置方式

    2021-11-03 11:01:21
  • Springboot如何根据实体类生成数据库表

    2023-11-20 13:54:39
  • idea输入sout无法自动补全System.out.println()的问题

    2023-11-28 21:34:03
  • Java 客户端操作 FastDFS 实现文件上传下载替换删除功能

    2022-06-01 15:01:38
  • asp之家 软件编程 m.aspxhome.com