• 在项目中如何直接使用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 2022/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 2022/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,拿到跑测试, 具体下载过程就不一样展示了,直接贴出测试结果。

    ![测试结果]](https://img2022.cnblogs.com/blog/1495071/202206/1495071-20220604154925529-898198001.jpg)

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

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

    Jmeter测试接口返回结果

    四、总结

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

    如果有问题,欢迎指出,谢谢!

  • 相关阅读:
    下一代Ajax技术 — Fetch的学习与使用
    Cadence orcad 批量设置原理图标题栏
    基层医院信息管理系统源码 his系统全套成品源码带电子病历4级
    【数据结构笔记5】- 线索二叉树-(深入刨析理解构造线索二叉树+如何利用线索非递归遍历二叉树)
    【Leetcode】1824. Minimum Sideway Jumps
    亚马逊云科技在天津设立智能制造数字化赋能中心
    mysql explain extra 信息分析
    C语言文件操作、C++文件操作、QT文件操作汇总及对比分析
    20天深度复习JavaSE的详细笔记(十二)——集合(Collection、数据结构、List、泛型深入)
    清洁机器人--沿边测距传感器 sharp psd红外传感器的FOV角度分析
  • 原文地址:https://www.cnblogs.com/lifacheng/p/16341993.html