文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringCloudHystrix服务降级限流策略详解

2023-01-04 12:00

关注

前言

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

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

Hystrix简介

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

Hystrix的使用

服务降级

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

2F9FB80F-7D80-4685-A718-FD1419ABADC9.png

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();
    }
    
    private String timeOutFallbackMethod() {
        return "服务访问失败,降级处理";
    }
}

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

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

C317DBCC-0E56-438C-A286-5ADF205CAE4A.png

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

AF11A118-43B1-4CAD-B04B-467E6B67B197.png

6DE5C48E-3EF2-46BE-A652-7B23FEFF12D3.png

System2调System降级场景

controller

@RestController
@AllArgsConstructor
@RequestMapping("/provider")
public class HystrixProviderController {
    @Autowired
    private HystrixService hystrixService;
    
    @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 {
    
    @GetMapping("/hystrix/error")
    public String errorMethod();
    
    @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 服务降级限流的资料请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯