springcloud熔断降级组件hystrix详解

在了解hystrix之前我们要先了解一下什么是服务雪崩

服务雪崩

雪崩是系统中的蝴蝶效应导致其发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源耗尽。从源头上我们无法完全杜绝雪崩源头的发生,但是雪崩的根本原因来源于服务之间的强依赖,所以我们可以提前评估。当整个微服务系统中,有一个节点出现异常情况,就有可能在高并发的情况下出现雪崩,导致调用它的上游系统出现响应延迟,响应延迟就会导致 tomcat 连接本耗尽,导致该服务节点不能正常的接收到正常的情况,这就是服务雪崩行为。
在这里插入图片描述
在这里插入图片描述

服务隔离

如果整个系统雪崩是由于一个接口导致的,由于这一个接口响应不及时导致问题,那么我们就有必要对这个接口进行隔离,就是只允许这个接口最多能接受多少的并发,做了这样的限制后,该接口的主机就会空余线程出来接收其他的情况,不会被哪个坏了的接口占用满。Hystrix 就是一个不错的服务隔离框架。

Hystrix 的导入

  <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
  </dependency>
/**
     *  Command属性
     *  execution.isolation.strategy  执行的隔离策略
     *  THREAD 线程池隔离策略  独立线程接收请求
     *  SEMAPHORE 信号量隔离策略 在调用线程上执行
     *
     *  execution.isolation.thread.timeoutInMilliseconds  设置HystrixCommand执行的超时时间,单位毫秒
     *  execution.timeout.enabled  是否启动超时时间,true,false
     *  execution.isolation.semaphore.maxConcurrentRequests  隔离策略为信号量的时候,该属性来配置信号量的大小,最大并发达到信号量时,后续请求被拒绝
     *
     *  circuitBreaker.enabled   是否开启断路器功能
     *  circuitBreaker.requestVolumeThreshold  该属性设置在滚动时间窗口中,断路器的最小请求数。默认20,如果在窗口时间内请求次数19,即使19个全部失败,断路器也不会打开
     *  circuitBreaker.sleepWindowInMilliseconds    改属性用来设置当断路器打开之后的休眠时间,休眠时间结束后断路器为半开状态,断路器能接受请求,如果请求失败又重新回到打开状态,如果请求成功又回到关闭状态
     *  circuitBreaker.errorThresholdPercentage  该属性设置断路器打开的错误百分比。在滚动时间内,在请求数量超过circuitBreaker.requestVolumeThreshold,如果错误请求数的百分比超过这个比例,断路器就为打开状态
     *  circuitBreaker.forceOpen   true表示强制打开断路器,拒绝所有请求
     *  circuitBreaker.forceClosed  true表示强制进入关闭状态,接收所有请求
     *
     *  metrics.rollingStats.timeInMilliseconds   设置滚动时间窗的长度,单位毫秒。这个时间窗口就是断路器收集信息的持续时间。断路器在收集指标信息的时会根据这个时间窗口把这个窗口拆分成多个桶,每个桶代表一段时间的指标,默认10000
     *  metrics.rollingStats.numBuckets   滚动时间窗统计指标信息划分的桶的数量,但是滚动时间必须能够整除这个桶的个数,要不然抛异常
     *
     *  requestCache.enabled   是否开启请求缓存,默认为true
     *  requestLog.enabled 是否打印日志到HystrixRequestLog中,默认true
     *
     *  @HystrixCollapser   请求合并
     *  maxRequestsInBatch  设置一次请求合并批处理中允许的最大请求数
     *  timerDelayInMilliseconds  设置批处理过程中每个命令延迟时间
     *  requestCache.enabled   批处理过程中是否开启请求缓存,默认true
     *
     *  threadPoolProperties
     *  threadPoolProperties 属性
     *  coreSize   执行命令线程池的最大线程数,也就是命令执行的最大并发数,默认10
     *
     */

启动类开启 hystrix 功能

在这里插入图片描述

代码使用

    @HystrixCommand
    @Override
    public String queryTicket() {
        return "queryTicket";
    }

Hystrix 服务隔离策略

线程池隔离

THREAD 线程池隔离策略 独立线程接收请求 默认采用的就是线程池隔离

代码配置

在这里插入图片描述
默认线程池中有 10 个线程,可以配置线程池中线程大小
在这里插入图片描述

信号量隔离

信号量隔离是采用一个全局变量来控制并发量,一个请求过来全局变量加 1,单加到跟配置中的大小相等是就不再接受用户请求了。

代码配置

在这里插入图片描述

execution.isolation.semaphore.maxConcurrentRequests
这参数是用来控制信号量隔离级别的并发大小的

Hystrix 服务降级

服务降级是对服务调用过程的出现的异常的友好封装,当出现异常时,我们不希
望直接把异常原样返回,所以当出现异常时我们需要对异常信息进行包装,抛一
个友好的信息给前端。
Hystrix 降级的使用比较简单

代码示例

在这里插入图片描述
指定降级方法
定义降级方法,降级方法的返回值和业务方法的方法值要一样
在这里插入图片描述

Hystrix 数据监控

Hystrix 进行服务熔断时会对调用结果进行统计,比如超时数、bad 请求数、降
级数、异常数等等都会有统计,那么统计的数据就需要有一个界面来展示,hystrix-dashboard 就是这么一个展示 hystrix

引入包

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<!--spring所有监控-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

启动类

在这里插入图片描述
Dashboadr 界面
http://localhost:9990/hystrix
然后在界面中输入需要监控的端点 url:
http://localhost:8083/actuator/hystrix.stream

在这里插入图片描述
在这里插入图片描述

Hystrix熔断

熔断就像家里的保险丝一样,家里的保险丝一旦断了,家里就没点了,家里用电器功率高了就会导致保险丝端掉。在我们springcloud领域也可以这样理解,如果并发高了就可能触发hystrix的熔断。

熔断发生的三个必要条件:

  1. 有一个统计的时间周期,滚动窗口
    相应的配置属性
    metrics.rollingStats.timeInMilliseconds
    默认10000毫秒

  2. 请求次数必须达到一定数量
    相应的配置属性
    circuitBreaker.requestVolumeThreshold
    默认20次

  3. 失败率达到默认失败率
    相应的配置属性
    circuitBreaker.errorThresholdPercentage
    默认50%

上述3个条件缺一不可,必须全部满足才能开启hystrix的熔断功能。
当我们的对一个线程池大小是100的方法压测时看看hystrix的熔断效果:

在这里插入图片描述
在这里插入图片描述
可以看到失败率超过50%时,circuit的状态是open的。

熔断器的三个状态:

  1. 关闭状态
    关闭状态时用户请求是可以到达服务提供方的
  2. 开启状态
    开启状态时用户请求是不能到达服务提供方的,直接会走降级方法
  3. 半开状态
    当hystrix熔断器开启时,过一段时间后,熔断器就会由开启状态变成半开状态。
    半开状态的熔断器是可以接受用户请求并把请求传递给服务提供方的,这时候如果远程调用返回成功,那么熔断器就会有半开状态变成关闭状态,反之,如果调用失败,熔断器就会有半开状态变成开启状态。

Hystrix功能建议在并发比较高的方法上使用,并不是所有方法都得使用的。

Feign的使用

Feign是对服务端和客户端通用接口的封装,让代码可以复用做到统一管理。

jar包导入

       <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

启动类导入feign客户端

在这里插入图片描述

feign客户端(调用方)

在这里插入图片描述

服务端接口(提供方)

在这里插入图片描述

服务端接口必须定义跟feign客户端相同的url

参数传递

  1. 对象类型参数
    调用方
    在这里插入图片描述
    服务方
    在这里插入图片描述

实际上传的是字符串

  1. 其他参数
    调用方
    在这里插入图片描述
    这里必须指定参数名称
    服务方
    在这里插入图片描述

Feign的服务降级

在这里插入图片描述

@Component
public class StudentServiceFallbackFactory implements FallbackFactory<StudentService> {

    @Override
    public StudentService create(Throwable throwable) {

        if(throwable == null) {
            return null;
        }
        final String msg = throwable.getMessage();
        log.info("exception:" + msg);
        return new StudentService() {
            @Override
            public String getAllStudent() {
                log.info("exception=====getAllStudent==========" + msg);
                return msg;
            }

            @Override
            public String saveStudent(Student student) {
                log.info("exception=====saveStudent==========" + msg);
                return msg;
            }

            @Override
            public String getStudentById(Integer id) {
                log.info("exception=====getStudentById==========" + msg);
                return msg;
            }

            @Override
            public String errorMessage(Integer id) {
                log.info("exception=====errorMessage==========" + msg);
                return msg;
            }
        };
    }
}

这里在调用对应feign客户端方法出现异常了,就会回调到create方法中,最终会回调到对应的客户端方法中

Feign的异常过滤器

这个过滤器是对异常信息的再封装,把feign的异常信息封装成我们系统的通用异常对象
在这里插入图片描述

@Configuration
public class FeignErrMessageFilter {

    @Bean
    public ErrorDecoder errorDecoder() {
        return new FeignErrorDecoder();
    }

    /*
    * 当调用服务时,如果服务返回的状态码不是200,就会进入到Feign的ErrorDecoder中
    * {"timestamp":"2020-02-17T14:01:18.080+0000","status":500,"error":"Internal Server Error","message":"/ by zero","path":"/feign/student/errorMessage"}
    * 只有这种方式才能获取所有的被feign包装过的异常信息
    *
    * 这里如果创建的Exception是HystrixBadRequestException
    * 则不会走熔断逻辑,不记住熔断统计
    * */
    class FeignErrorDecoder implements ErrorDecoder {

        private Logger logger = LoggerFactory.getLogger(FeignErrorDecoder.class);

        @Override
        public Exception decode(String s, Response response) {

            RuntimeException runtimeException = null;

            try {
                String retMsg = Util.toString(response.body().asReader());
                logger.info(retMsg);

                runtimeException = new RuntimeException(retMsg);

            } catch (IOException e) {
                e.printStackTrace();
            }
            return runtimeException;
        }
    }
}

过滤器把异常返回后,feign前面定义的降级方法就会调到create方法

Feign 我不建议大家使用,流程简单并发不高的方法可以用一用。仅代表个人学习建议

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
SpringCloud降级组件HystrixHystrix是一个用于处理分布式系统中的故障和延迟的库。它通过隔离、熔断降级等机制来提高系统的容错性。通过使用Hystrix,我们可以实现服务的降级,防止故障的扩散,并提供更好的用户体验。具体实现思路可以在API网关中通过过滤器的run方法来实现。通过RequestContext获取即将路由的服务ID,然后根据配置信息来获取降级的服务信息,如果当前路由的服务在降级列表中,就直接拒绝请求,并返回对应的降级信息给客户端处理。可以在SpringCloud Config的后台修改配置来实现降级的动态调整,也可以根据监控指标如流量、负载等自动触发降级操作。在代码实现方面,可以在Controller中编写降级方法,并使用Hystrix来配置降级。同时,对于使用Feign调用服务,可以启用服务降级功能。在主启动类中启用Hystrix,并在调用方法上配置相应的降级方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [springcloud熔断降级组件hystrix详解.part1.rar](https://download.csdn.net/download/keenstyle/12232188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [springcloud-降级](https://blog.csdn.net/weixin_44012040/article/details/102477486)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [springCloud服务降级的三种方式](https://blog.csdn.net/a10534126/article/details/124442783)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一名技术极客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值