欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Spring Cloud Hystrix的基本用法大全,

来源: javaer 分享于  点击 13216 次 点评:224

Spring Cloud Hystrix的基本用法大全,


目录
  • 1. Hystrix的简单使用
    • 1.1 服务降级
    • 1.2 服务熔断
  • 2. OpenFeign集成Hystrix
    • 3. Hystrix熔断原理
      • 3.1 熔断状态
      • 3.2 熔断的工作原理
    • 4. 代码地址

      本文主要讲述Hystrix,也可以称之为豪猪哥。

      它是Spring Cloud中集成的一个组件,在整个生态中主要为我们提供以下功能:

      • 服务隔离

      服务隔离主要包括线程池隔离以及信号量隔离。

      • 服务熔断

      当请求持续失败的时候,服务进行熔断,默认熔断5S,也是就说在这5S内的请求一律拒绝。

      • 服务降级

      当前请求失败的时候,返回降级的结果。

      1. Hystrix的简单使用

      1.1 服务降级

      添加依赖

      <!--        hystrix-->
              <dependency>
                  <groupId>org.springframework.cloud</groupId>
                  <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
              </dependency>
      1. 启动类添加注解
      @EnableCircuitBreaker //开启熔断
      • 对应接口加上注解

      注解里面相关的参数可以至HystrixCommandProperties类中查找;注解里面也可以不写相关内容。

      fallbackMethod = "fallback"里面是熔断方法名。

      //HystrixCommandProperties
          @HystrixCommand( commandProperties = {
                  @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10")
          },fallbackMethod = "fallback")
          @GetMapping
          public String order() {
              log.info("begin do order");
      //        使用openfiegn
              String goods = goodsService.getGoodsById();
              String promotion = promotionService.getPromotionById();
              String result = orderService.createOrder(goods, promotion);
              return result;
          }
      
       	public String fallback(){
              return "触发降级";
          }
      

      修改商品服务的接口,加上超时时间,使接口调用错误。

      @GetMapping("/goods")
      public String getGoodsById() {
      
          try {
              Thread.sleep(3000);
          } catch (Exception e){
              e.printStackTrace();
          }
          log.info("收到请求,端口为:{}", port);
          return "返回商品信息";
      }
      

      启动项目,调用接口,看是否可以进行服务降级。

      1.2 服务熔断

      熔断的触发机制

      在10S内,超过20次请求,并且失败率超过50%(默认情况)- > 触发熔断

      熔断后经过一段时间等待后又可以继续正常访问。

      我们稍微改造下代码:

          @HystrixCommand(commandProperties = {
                  @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求阈值
                  @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),//熔断窗口持续时间
                  @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")//错误比
          }, fallbackMethod = "fallback")
          @GetMapping("/{num}")
          public String order(@PathVariable("num") int num) {
              if (num % 2 == 0) {
                  return "正常访问。";
              }
      
              log.info("begin do order");
              String goods = goodsService.getGoodsById();
              String promotion = promotionService.getPromotionById();
              String result = orderService.createOrder(goods, promotion);
              return result;
          }
          public String fallback(int num) {
              return "触发降级";
          }
      

      我们来看下上述代码,首先我们给接口添加了相关一个参数,在接口中根据传参来执行不同的操作,比如参数为2那就正常返回,如果参数为1 就执行下面的代码,由于我们加了超时时间,所以会调用失败。

      注意,我们给接口加了参数后,服务降级的方法也要加上相关参数,否则会错误。

      触发的相关机制都是可以根据参数自己修改的,大家测试的时候可以将请求阈值设置小一点,方便测试查看效果。

      2. OpenFeign集成Hystrix

      以上都是我们直接在客户端调用的时候直接集成Hystrix来进行服务的保护,那在OpenFeign中我们该如何集成呢?

      然后我们在service-api项目中引入相关依赖:

      <!--        hystrix-->
      <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
      </dependency>
      

      然后我们在暴露接口的地方创建相关回调实现:

      我们首先实现暴露接口的FeignClient,然后在实现的方法中编写对应的降级操作即可,这样当发生调用失败的情况,则会返回降级的信息。

      这里可以使用component注解将该类交给spring管理,或者通过configuration注解进行处理。

      //@Component
      public class IGoodsServiceFallback implements IGoodsServiceFeignClient {
      
          @Override
          public String getGoodsById() {
              return "查询商品信息异常,触发降级保护机制。";
          }
      }
      

      编写完该类后,我们需要至FeignClient处进行相关配置。

      @FeignClient(name = "goods-service",
              configuration = FeignClientLogConfiguration.class,
              fallback = IGoodsServiceFallback.class)
      public interface IGoodsServiceFeignClient extends IGoodsService {
      }

      这里修改完成后,我们就可以至集成服务修改相关配置了。

      首先在配置文件中开启feign的熔断保护机制。

      #开启feign的熔断保护机制
      feign.hystrix.enabled=true
      

      然后需要将之前的IGoodsServiceFallback交给spring容器进行管理,我这里是使用的configuration注解进行处理的。

      @Configuration
      public class HystrixFallbackConfiguration {
      
          @Bean
          public IGoodsServiceFallback goodsServiceFallback() {
              return new IGoodsServiceFallback();
          }
      }

      以上便是我们的全部配置,这个时候我们只需要去goods-service中的调用接口人为的制造一些异常,这样调用的时候就可以触发异常了。

      比如我直接加了超时时间:

      @Slf4j
      @RestController
      public class GoodsService implements IGoodsService  {
      
          @Value("${server.port}")
          private String port;
      
          /**
           * 根据ID查询商品信息
           *
           * @return
           */
          @GetMapping("/goods")
          public String getGoodsById() {
      
              try {
                  Thread.sleep(5000);
              } catch (Exception e){
                  e.printStackTrace();
              }
              log.info("收到请求,端口为:{}", port);
              return "返回商品信息";
          }
      }

      然后我们就可以直接开始测试了:

      可以看到成功获取了降级信息,代表我们集成成功。

      实际上我们在调用OpenFeign接口的时候,他会判断我们的Feign接口上是否有Hustrix的一些机制,如果有的话先进行相关判断,然后在执行请求。如下图所示:

      3. Hystrix熔断原理

      下图为Hystrix的熔断简单工作原理,调用出现异常后,如果错误率达到一个阈值,则开始熔断。相关的阈值,时间等都是可以进行配置的。

      3.1 熔断状态

      • open

      触发熔断,意味着请求不会发送到服务端,而是直接调用fallback。

      • closed

      熔断关闭,表示可以正常通信。

      • Half-Open

      熔断的自动恢复机制。通过尝试的方式,判断服务是否正常,然后恢复到closed 状态;如果还是异常,则继续保持熔断。

      3.2 熔断的工作原理

      使用滑动窗口来实现数据的统计。

      可能有人不太了解什么是滑动窗口。

      我们首先来看下计数器的一种实现方式,类似我们在60s内只能发送一次短信。比如下图,限制一分钟之内只能接受100个请求,但是位于临界点的时候,我们可能突然收到200个请求,所以可能会导致一些问题。

      滑动窗口和计算器是类似的,首先多了一个滑动的步骤,窗口会随着时间往前滑动。然后我们的窗口大小是固定的(可以自己设置),比如下图我们的窗口大小就是60S,随着时间的推进,窗口向前滑动,但是会保证大小不变。

      熔断的阈值就是根据滑动窗口的请求数以及失败次数来进行计算的,从而判断出是否开启熔断。

      RxJava 响应式编程(类似webflux),实现事件流的分发。

      既然了解了他的大致原理,我们再将这部分带入之前的流程中来看:

      我们一个请求进来后,如果该接口声明了HystrixCommand注解,首先会调用allowRequest方法去校验当前请求是否允许发生:判断当前是否位于isOpen状态,如果是则直接返回服务降级的逻辑;如果不是则判断当前时间窗口的总健康请求数量是否大于20次(阈值可自行设置),小于则正常执行,如果大于则判断当前滑动窗口内的错误请求率是否达到阈值,从而开启熔断状态。

      滑动窗口的数据统计都是通过事件流来实现的,任务执行结束后,通过发布一个时间,然后将相关数据更新到当前时间窗口中,老的数据则直接丢弃。相关流程比较复杂,这里不过多阐述。

      4. 代码地址

      微服务案例

      到此这篇关于Spring Cloud Hystrix的基本使用的文章就介绍到这了,更多相关Spring Cloud Hystrix使用内容请搜索3672js教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持3672js教程!

      您可能感兴趣的文章:
      • SpringCloud之Hystrix的详细使用
      • SpringCloud Hystrix的使用
      • spring cloud hystrix 超时时间使用方式详解
      • springcloud使用Hystrix进行微服务降级管理
      • SpringCloud Zuul在何种情况下使用Hystrix及问题小结
      • springcloud 熔断器Hystrix的具体使用
      相关栏目:

      用户点评