SpringCloud中的Hystrix


为什么要学这个?你不想面试的时候多装两个逼多拿两千块钱?

Hystrix现在已经停止维护,有兴趣可以看我的另一篇博客链接: link.
首先我们先想一想分布式微服务可能存在哪些问题。

服务雪崩
多个微服务之间的调用,假设A调用B,B又调用C和D服务,C和D又分别调用其他的微服务。
那么此次请求的涉及面就越来越大,这就是“扇出”!假如当前D这个服务调用时间过长或者挂掉了
那么对于A的以后调用就会占据越来越多的资源,从而引起系统崩溃。

简单来说,当你发现一个模块故障了之后,但是这个模块还会继续的接收请求,然而这个故障模块还调用了其他很多的模块,这样就发生了级联故障,这就是雪崩。

这里我们学习一下Hystrix

Hystrix是一个用于分布式系统的延迟的容错的开源组件,在分布式系统里不可避免会遇到调用失败,超时,异常等,Hystrix可以保证在一个依赖的服务出问题的时候,不会导致整体服务失败,避免雪崩。

1.服务降级

链接: 服务降级.

2.服务熔断

学习服务熔断请先学:服务降级
服务达到最大访问量了,直接拒绝访问,然后调用服务降级的方法给调用方一个友好提示。然后根据一定的规则慢慢试着恢复服务。

下面直接开始代码(我只贴重要的部分)

在服务端8001端口有这样一个接口。服务降级我就不多赘述了,一句话就是testServiceBreaker方法在降级过后会走到testServiceBreakerFallBack方法中直接返回。

那么那一大段注解属性是什么呢?我来解释一下
在规定的时间窗口期内10s,监控期间的10次请求,如果其中有百分之60失败,那就熔断!

//服务熔断。。。。。
    @Override
    @HystrixCommand(fallbackMethod = "testServiceBreakerFallBack",
            commandProperties = {
                    //是否开启断路器
                    @HystrixProperty(name="circuitBreaker.enable",value = "true"),
                    //请求次数
                    @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "10"),
                    //时间窗口期
                   @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
                    //失败率达到多少后,熔断
                    @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "60")
            })
    public String testServiceBreaker(Integer id) {

        if(id < 0){
            throw  new RuntimeException("参数ID不能为负数");
        }

        return "调用成功,流水号"+ UUID.randomUUID().toString();
    }

    public String testServiceBreakerFallBack(Integer id) { return "服务降级,参数Id不能为0"; }

经过测试我们发现!
1.一开始,我们访问带的参数Id的正数,那么服务器也正常返回了我们想要的结果。
2.我们用负数Id去访问,让服务报错,发现服务被降级,返回了“服务降级,参数Id不能为0”字符串。
3.这时候我们重复1的操作,得到了正常的结果。
4.现在我们带着负数Id疯狂访问,在10秒内我访了几十次,这个时候熔断组件监听到了服务器报错次数已经超过我们的阈值(10s内每10个请求超过6成报错),好,熔断!
5.现在我们重复1的操作,发现返回的也是降级过后的结果,服务已经不对外开放了,直接降级!
6。一段时间过后,我们再重复1的操作,发现恢复了正常访问,熔断结束。

总结:

服务熔断有三个状态

  1. 熔断打开:服务不再接受任何请求,在指定时间过后(默认5s),进入到熔断半开
  2. 熔断半开:允许一个请求进入,如果符合规则不报错不降级,进入到熔断关闭
  3. 熔断关闭:服务正常访问。直到再次触发熔断打开,进行1->2->3的轮回

3. 服务限流

高并发请求的情况下,禁止流量全部涌入,限制流量进入服务,如一秒N个。

服务限流我们不用Hystrix来讲解,请看我关于springcloudalibaba中的Sentinel组件

好了 基本已经讲完,欢迎大家评论区指出不足,一起学习进步!

大家看完了点个赞,码字不容易啊。。。