如何在Java中直接使用Hystrix?

Posted 编号94530

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Java中直接使用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,拿到跑测试, 具体下载过程就不一样展示了,直接贴出测试结果。

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

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

四、总结

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

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

以上是关于如何在Java中直接使用Hystrix?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中直接使用Hystrix?

如何直接在 @FeignClient 中定义 Hystrix Client Fallback

SpringCloud之熔断器使用(Hystrix)

如何向 Turbine 添加额外的 Hystrix 指标聚合

010 Hystrix的使用

如何说 Hystrix 不会为 Hystrix 命令中的某些异常触发回退