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

 更新时间:2023年01月04日 08:41:54   作者:Lxlxxx  
这篇文章主要为大家介绍了Spring Cloud Hystrix 服务降级限流策略详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

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

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

Hystrix简介

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

Hystrix的使用

服务降级

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

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; 接口异常情况下降级

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

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;
    }
}

总结

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

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

相关文章

  • Java解决线程安全的两种方式分享

    Java解决线程安全的两种方式分享

    这篇文章主要为大家详细介绍了Java中两种常用的解决线程安全的方式——Synchornized和Lock,文中的示例代码简洁易懂,快跟随小编一起学习起来吧
    2023-06-06
  • JAVA偏向锁的原理与实战

    JAVA偏向锁的原理与实战

    这篇文章主要为大家详细介绍了JAVA偏向锁的原理与实战,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Linux下JDK安装教程

    Linux下JDK安装教程

    这篇文章主要为大家详细介绍了Linux下JDK安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • Spring注解Autowired的底层实现原理详解

    Spring注解Autowired的底层实现原理详解

    从当前springboot的火热程度来看,java config的应用是越来越广泛了,在使用java config的过程当中,我们不可避免的会有各种各样的注解打交道,其中,我们使用最多的注解应该就是@Autowired注解了。本文就来聊聊Autowired的底层实现原理
    2022-10-10
  • MyBatis-Plus updateById更新不了空字符串或null的解决方法

    MyBatis-Plus updateById更新不了空字符串或null的解决方法

    本文主要介绍了MyBatis-Plus updateById更新不了空字符串或null的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Spring FreeMarker整合Struts2过程详解

    Spring FreeMarker整合Struts2过程详解

    这篇文章主要介绍了Spring FreeMarker整合Struts2过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Spring与Mybatis的整合方法有哪些

    Spring与Mybatis的整合方法有哪些

    本文主要给大家介绍Spring与Mybatis的三种常用整合方法,需要用到的整合框架包mybatis-spring.jar,对spring mybatis整合感兴趣的朋友可以参考下本文
    2015-10-10
  • java之构造器的重载问题

    java之构造器的重载问题

    这篇文章主要介绍了java之构造器的重载问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Spring实现对象注入的三种方法详解

    Spring实现对象注入的三种方法详解

    这篇文章主要为大家学习介绍了Spring中实现对象注入的三种常用方法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-07-07
  • java调用webservice的.asmx接口的使用步骤

    java调用webservice的.asmx接口的使用步骤

    这篇文章主要介绍了java调用webservice的.asmx接口的使用步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论