SpringCloud从入门到入土04-Hystrix断路器

78 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1. 什么是服务雪崩

多个服务之间调用,比如A调用B,B又调用C。这就叫做扇出,如果调用中间的链路,比如C服务因为网络或者其他原因导致调用时间过长或者服务不可用,那么服务A的调用就会占用越来越多的资源,造成服务雪崩。

2.什么是Hystrix?

Hystrix是SpringCloud提供的一个服务熔断器,用来避免服务雪崩造成的整个系统不可用。

服务降级 服务熔断 服务限流 服务监控

官方地址

2.1 服务熔断

什么是服务熔断,服务熔断是应对服务雪崩的一种保护机制,当调用一个服务出错时,我们直接返回错误,当每秒钟调用超过20次时,就会就会启动熔断机制。

我们模拟服务熔断机制。

2.1.1 pom文件

        <!--导入Hystrix依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.10.RELEASE</version>
        </dependency>
    </dependencies>

2.1.2 controller添加接口

    @HystrixCommand(fallbackMethod = "hystrixGet")
    @RequestMapping("testError")
    public String testError(int num){
        System.out.println("1");
        float num2 = 1/num;
        return String.valueOf(num2);
    }

    /**
     * 根据id查询备选方案(熔断)
     * @param
     * @return
     */
    public String hystrixGet(int num){
        return "服务熔断了!";
    }

需要注意的是,我们的熔断方法是传参和返回值必须和接口一样。

2.1.3 添加启动测试

启动类添加注解

@EnableHystrix  // 添加对熔断的支持注解

在这里插入图片描述 如果正常异常,这里不捕获异常就会出错,但是现在就会走我们熔断的方法,但是这并不是服务熔断。 我们快速点击刷新,模拟熔断机制,就会发展当5秒调用超过20次后,就会触发熔断。 熔断后就不会再走网络调用,直接返回错误信息,减少资源占用。相当于服务降级 进入熔断状态后,后续对该服务接口的调用不再经过网络,直接执行本地的默认方法,达到服务降级的效果。 当经过了规定时间之后,服务将从熔断状态回复过来,再次接受调用方的远程调用。

2.2服务降级

当某一时间内服务A的访问量暴增,而B和C的访问量较少,为了缓解A服务的压力,这时候需要B和C暂时关闭一些服务功能,去承担A的部分服务,从而为A分担压力,叫做服务降级。

就是尽可能的把系统资源让给优先级高的服务。在系统的访问量和并发量比较高的情况下需要把一些功能暂时进行降级,把更多的资源给到更重要的服务。 比如双十一时间,为了让抢购和付款功能得到保证,更多的资源给他他们防止高并发造成一些后果,就会暂时把退款啊,查询历史订单啊等功能暂时关闭。

自动降级分类 超时降级,失败次数降级,故障降级和限流降级。

2.2.1 pom文件

上面2.1.1已经引入了netflix-hystrix的依赖

2.2.2 新建类实现FallbackFactory

package com.liu.service;

import org.springframework.cloud.openfeign.FallbackFactory;

//Hystrix服务降级 ~
public class ClientServiceFallBackFactory implements FallbackFactory {
    @Override
    public Object create(Throwable cause) {
        return new FeignClientService(){

            @Override
            public String testFeign() {
                return "服务降级了!";
            }
        };
    }
}


注意这边实现FallbackFactory后,重新create方法,返回直接new一个要降级的Feign的接口,然后再重新。

这样后面服务中,远程调用的比如我们这边Feign调用的demo1,后面就不会再走网络调用了,直接走这个ClientServiceFallBackFactory 内部,直接返回结果。

2.2.3 @FeignClient注解加上fallbackFactory参数

@FeignClient(value = "demo1",fallbackFactory = ClientServiceFallBackFactory.class)

这样就可以在不改变代码的情况下,双十一来临时,在配置文件开启服务降级,原先调用退款等FeignClient接口都统一降级,在退款服务已经关闭情况,不走网络调用直接返回服务降级不可用,减小资源开销

2.3 服务熔断和服务降级比较

服务熔断是直接服务宕机,相当于保险丝爆了,后面就会直接返回结果 服务降级是每次都会先访问正常方法,当发现正常方法不可用,才会走降级的方法。

降级:服务分优先级,牺牲非核心服务(不可用),保证核心服务稳定;从整体负荷考虑; 熔断:依赖的下游服务故障触发熔断,避免引发本系统崩溃;系统自动执行和恢复

3. Dashboard 流监控

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

@EnableHystrix // 添加对熔断的支持注解 这样上云后再用云上监控