一、背景
最近由于一些背景原因,需要在项目中需要对接口进行限流。所以就考虑到了直接使用 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。
commandKey
和threadPoolKey
是自己设置的,可以为这个方法定制线程数、核心线程等配置(在 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 中查看一下结果,也是可以佐证我们的效果。测试图如下:
Jmeter测试接口响应结果
四、总结
自此,整个流程是走完了,可以看到效果着实起来了。 Hystrix 知识限流熔断中的一种方案,大家可以结合实际情况做出更多的选择。
如果有问题,欢迎指出,谢谢!
评论