写点什么

如何在项目中直接使用 Hystrix?

作者:编号94530
  • 2022 年 6 月 04 日
  • 本文字数:2528 字

    阅读完需:约 8 分钟

如何在项目中直接使用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=3000hystrix.command.default.fallback.isolation.semaphore.maxConcurrentRequests=1000hystrix.command.default.circuitBreaker.requestVolumeThreshold=20hystrix.command.default.metrics.rollingStats.numBuckets=10hystrix.command.default.metrics.rollingStats.timeInMilliseconds=10000hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5000hystrix.command.default.circuitBreaker.errorThresholdPercentage=50hystrix.command.default.circuitBreaker.forceOpen=falsehystrix.command.default.circuitBreaker.forceClosed=falsehystrix.command.default.requestCache.enabled=false
hystrix.threadpool.default.coreSize=10hystrix.threadpool.default.maximumSize=10hystrix.threadpool.default.allowMaximumSizeToDivergeFromCoreSize=truehystrix.threadpool.default.keepAliveTimeMinutes=1hystrix.threadpool.default.maxQueueSize=100hystrix.threadpool.default.queueSizeRejectionThreshold=101hystrix.threadpool.default.metrics.rollingStats.numBuckets=10hystrix.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 */@Configurationpublic 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 包带的切面,通过切面通知,找去需要熔断的方法,然后进行处理。


@Aspectpublic 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 */@RestControllerpublic 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=1hystrix.threadpool.hystrixTestController-getHello.maximumSize=2hystrix.threadpool.hystrixTestController-getHello.maxQueueSize=1hystrix.threadpool.hystrixTestController-getHello.queueSizeRejectionThreshold=2#-------------------------------------------------------------------
复制代码


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

三、测试试验

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


熔断器测试结果


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


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

Jmeter测试接口响应结果


四、总结

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

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

发布于: 刚刚阅读数: 3
用户头像

编号94530

关注

你的每一个点赞,我都当做喜欢 2020.04.29 加入

新时代农民工

评论

发布
暂无评论
如何在项目中直接使用Hystrix?_Java_编号94530_InfoQ写作社区