Spring-Cloud-Netflix-Hystrix操作

2023-11-27 13:22:44 浏览数 (3)

Spring-Cloud-Netflix-Hystrix

雪崩问题

一个服务,依赖于另一个功能服务的,如果这个功能服务挂掉了,那么依赖的服务就不能再用了,这种级联的失败, 我们可以称之为雪崩

Hystrix概述

Hystrix github地址

  1. Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等
  2. Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

降级

什么是降级?

  1. 降级是当我们的某个微服务响应时间过长,或者不可用了也就是那个微服务调用不了了,
  2. 我们不能吧错误信息返回出来,或者让他一直卡在那里,所以要在准备一个对应的策略(一个方法)
  3. 当发生这种问题的时候我们直接调用这个方法来快速返回这个请求,不让他一直卡在那
  4. 当某个微服务调用不了了要做降级,也就是说,要在调用方做降级(不然那个微服务都down掉了再做降级也没什么意义了)
降级步骤
  1. 在服务调用方法添加依赖
代码语言:javascript复制
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
  1. 启动类加入注解@EnableHystrix
代码语言:javascript复制
@EnableHystrix
  1. 在控制器调用方法上添加注解@HystrixCommand
  1. 在goods服务当中模拟一个异常

启动运行

超时监听

  1. 模拟响应过慢

当响应过慢(默认值是1000),访问时,也会进入到指定的降级方法当中

  1. 在客户端配置文件当中配置超时时间
代码语言:javascript复制
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 9000 # 设置hystrix的超时时间为9000ms

ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 10000 

使用Fengin调用 Feign默认也有对Hystix的集成,1默认情况下是关闭的。我们需要通过下面的参数来开启:

代码语言:javascript复制
feign:
  hystrix:
    enabled: true # 开启Feign的熔断功能

运行

把goods的睡眠时间改成1000 运行:

运行:

熔断

概述:

  1. 也叫断路器,CirleBreak
  2. 熔断,就好像我们生活中的跳闸一样, 比如说你的电路出故障了,为了防止出现大型事故 这里直接切断了你的电源以免意外继续发生
  3. 当一个微服务调用多次出现问题时(默认是10秒内20次当然 这个也能配置),hystrix就会采取熔断机制
  4. 不再继续调用你的方法, 而是直接调用降级方法,这样就一定程度上避免了服务雪崩的问题
  5. 会在默认5秒钟内和电器短路一样,5秒钟后会试探性的先关闭熔断机制,但是如果这时候再失败一次{之前是20次} 那么又会重新进行熔断

线程隔离降级处理, 如果请求延迟过高,如果超时,返回一个异常信息:

  1. 假设超时2秒, 但是用户也要等3秒才会返回异常信息
  2. 正常情况下, 一个请求只需要30ms就够了, 因为超时, 导致要多等2秒多,并发能力急剧下降,如果每次来都超时, 就认为这个服务可能存在问题,就可以认为 电路中负载最高的电压
  3. 此时, 就把此服务断开,再去访问时, 就不需要等待3秒,直接返回异常信息,把失败的时长急剧缩短 保证其它服务的高可用,这个服务就被临时断掉 4 断开很容易, 解决如何断开后, 再去给它连接回来, Hystrix就可以去解决这种问题
熔断配置

配置:

代码语言:javascript复制
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 9000 #设置超时时长
      circuitBreaker:
        requestVolumeThreshold: 5   #  10秒种访问5次都失败的话, 会断开服务,不调用方法,直接进入fallback
        sleepWindowInMilliseconds : 5000   #默认是5秒 5秒后尝试再访问一次服务器

goods模拟异常

  1. 调用5次后,就不再调用goods方法 持续调用后,中间还会调用一次goods方法 ,之后, 就不会再调用
  2. 默认5秒钟后会试探性的先关闭熔断机制,但是如果这时候再失败一次{之前是20次} 那么又会重新进行熔断

限流

概念:

  1. 限流, 顾名思义, 就是限制你某个微服务的使用量(可用线程)
  2. hystrix通过线程池的方式来管理你的微服务调用,他默认是一个线程池(10大小) 管理你的所有微服务
  3. 一个线程可以理解为一个请求,当10请求同时访问, 都没有得要响应的时候,就会自动调用fallback方法

默认什么都不设置 当访问请求次数超过10的时候 , 会调用fallback方法

feign整合hystrix

feign 默认是支持hystrix的, 但是在Spring - cloud Dalston 版本之后就默认关闭了, 因为不一定业务需求要用的到

  1. 开启feign 对hystrix的支持
代码语言:javascript复制
feign:
  hystrix:
    enabled: true #开启feign当中的hystrix
方式1-fallback
  1. 创建一个类实现服务FeignClient接口
  1. 在控制器当中调用

第一次运行

连续刷新11次后

方式2-fallbackFactory
  1. 创建一个类实现FallbackFactory
  1. 在服务FeignClient接口上配置实现类
  1. 在控制器当中调用

效果和第一种方式一样

0 人点赞