在项目中直接使用hystrix的流程分析

目录
  • 什么是Hystrix
  • 一、背景
  • 二、使用方式
    • 2.1 Jar包引入
    • 2.2 配置文件
    • 2.3 设置配置
    • 2.4 实现代码
  • 三、测试试验
    • 四、总结

      什么是Hystrix

      Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微服务时,有两种情况需要考虑:首先,如果远程系统当机了我们怎么办?

      其次,我们如何管理对远程微服务的调用性能,以保证每个微服务以最小延迟最快性能响应?

      Hystrix是一个有关延迟和失败容错的开源库包,用来设计隔离访问远程系统端点或微服务等,防止级联爆炸式的失败,也就是由一个小问题引起接二连三扩大的

      疯狂的错误爆炸直至整个系统瘫痪,能够让复杂的分布式系统更加灵活具有弹性。这篇文章给大家介绍下在项目中如何直接使用hystrix?

      一、背景

      最近由于一些背景原因,需要在项目中需要对接口进行限流。所以就考虑到了直接使用Hystrix。但是呢,又不想直接使用SpringCloud,而是直接引入原生,现在发现挺好用的,所以记录下来,分享出来。

      二、使用方式

      2.1 Jar包引入

      <dependency>
        <groupId>com.netflix.hystrix</groupId>
        <artifactId>hystrix-javanica</artifactId>
        <version>1.5.18</version>
      </dependency>
      
      <dependency>
        <groupId>com.netflix.hystrix</groupId>
        <artifactId>hystrix-core</artifactId>
        <version>1.5.18</version>
      </dependency>

      引入两个包,分别是Hystrix核心包,以及直接原生的Java包

      2.2 配置文件

      在Resources目录下面,放上hystrix.properties文件。配置如下。

      hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000
      hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=1000
      hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
      hystrix.command.default.metrics.rollingStats.numBuckets=10
      hystrix.command.default.metrics.rollingStats.timeInMilliseconds=10000
      hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000
      hystrix.command.default.circuitBreaker.errorThresholdPercentage=50
      hystrix.command.default.circuitBreaker.forceOpen=false
      hystrix.command.default.circuitBreaker.forceClosed=false
      hystrix.command.default.requestCache.enabled=false
      
      hystrix.threadpool.default.coreSize=10
      hystrix.threadpool.default.maximumSize=10
      hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=true
      hystrix.threadpool.default.keepAliveTimeMinutes=1
      hystrix.threadpool.default.maxQueueSize=100
      hystrix.threadpool.default.queueSizeRejectionThreshold=101
      hystrix.threadpool.default.metrics.rollingStats.numBuckets=10
      hystrix.threadpool.default.metrics.rollingStats.timeInMilliseconds=10000
      #hystrix.timer.threadpool.default.coreSize = 10

      这个是一部分配置,如果需要知道更多,可以Click-Github Hystrix Wiki

      2.3 设置配置

      设置Hystrix的配置

      /**
       * <p>熔断器配置</p>
       *
       * @author fattycal@qq.com
       * @since 2025/6/4
       */
      @Configuration
      public class HystrixConfig implements InitializingBean {
      
          @Bean
          public HystrixCommandAspect hystrixCommandAspect(){
              // 初始化切面
              return new HystrixCommandAspect();
          }
      
          @Override
          public void afterPropertiesSet() throws Exception {
              // 初始化熔断器配置
              // 清除配置
              ConfigurationManager.getConfigInstance().clear();
              // 加载配置文件
              ConfigurationManager.loadCascadedPropertiesFromResources("hystrix");
          }
      }

      HystrixCommandAspect是jar包带的切面,通过切面通知,找去需要熔断的方法,然后进行处理。

      @Aspect
      public class HystrixCommandAspect {
          //...略
      
          @Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand)")
          public void hystrixCommandAnnotationPointcut() {
          }
      
        @Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCollapser)")
          public void hystrixCollapserAnnotationPointcut() {
          }
      
          @Around("hystrixCommandAnnotationPointcut() || hystrixCollapserAnnotationPointcut()")
          public Object methodsAnnotatedWithHystrixCommand(final ProceedingJoinPoint joinPoint) throws Throwable {
              // ... 略
          }
      }

      ConfigurationManager看看这名字,就知道是配置管理的,也不负众望,的确是用来加载配置的。

      2.4 实现代码

      /**
       * <p>熔断器测试</p>
       *
       * @author fattycal@qq.com
       * @since 2025/6/4
       */
      @RestController
      public class HystrixTestController {
      
      
          @GetMapping("/hystrix")
          @HystrixCommand(commandKey = "hystrixTestController-getHello", threadPoolKey = "hystrixTestController-getHello",
                  fallbackMethod = "getHelloFallback")
          public String getHello(){
              try {
                  // 执行太快不便于测试
                  Thread.sleep(200);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
              return "TEST Hystrix";
          }
      
          public String getHelloFallback(Throwable error){
              // 打印日志
              System.out.println("TEST Hystrix: " + error.getMessage());
              return "TEST Hystrix: " + error.getMessage();
          }
      }

      代码没有啥花里胡哨的,直接在需要熔断的方法上面加上HystrixCommond。

      commandKeythreadPoolKey是自己设置的,可以为这个方法定制线程数、核心线程等配置(在hystrix.properties中添加)。给出示例如下。

      #-------------------------------------------------------------------
      hystrix.threadpool.hystrixTestController-getHello.coreSize=1
      hystrix.threadpool.hystrixTestController-getHello.maximumSize=2
      hystrix.threadpool.hystrixTestController-getHello.maxQueueSize=1
      hystrix.threadpool.hystrixTestController-getHello.queueSizeRejectionThreshold=2
      #-------------------------------------------------------------------

      至此,完成了所有的配置和准备,接下来直接测试

      三、测试试验

      直接从Jmeter官网下载jmeter,拿到跑测试, 具体下载过程就不一样展示了,直接贴出测试结果。

      由于为这个方法设置的核心线程数、线程数、队列数都不大,很容易测试出结果。我们可以从console中很明显的看到熔断器打开,说明方法被执行到。

      在从Jmeter中查看一下结果,也是可以佐证我们的效果。测试图如下:

      四、总结

      自此,整个流程是走完了,可以看到效果着实起来了。 Hystrix知识限流熔断中的一种方案,大家可以结合实际情况做出更多的选择。

      本文转自网络,如有侵权请联系客服删除。