一、背景
最近由於一些背景原因,需要在專案中需要對介面進行限流。所以就考慮到了直接使用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,拿到跑測試, 具體下載過程就不一樣展示了,直接貼出測試結果。
![測試結果]](https://img2022.cnblogs.com/blog/1495071/202206/1495071-20220604154925529-898198001.jpg)
由於為這個方法設定的核心執行緒數、執行緒數、佇列數都不大,很容易測試出結果。我們可以從console中很明顯的看到熔斷器開啟,說明方法被執行到。
在從Jmeter中檢視一下結果,也是可以佐證我們的效果。測試圖如下:
四、總結
自此,整個流程是走完了,可以看到效果著實起來了。 Hystrix知識限流熔斷中的一種方案,大家可以結合實際情況做出更多的選擇。
如果有問題,歡迎指出,謝謝!