在项目中直接使用hystrix的流程分析(hystrix return)

网友投稿 451 2022-07-26


目录什么是Hystrix一、背景二、使用方式2.1 Jar包引入2.2 配置文件2.3 设置配置2.4 实现代码三、测试试验四、总结

什么是Hystrix

Hystrix是Netflix针对微服务分布式系统的熔断保护中间件,当我们的客户端连接远程的微服务时,有两种情况需要考虑:首先,如果远程系统当机了我们怎么办?

其次,我们如何管理对远程微服务的调用性能,以保证每个微服务以最小延迟最快性能响应?

Hystrix是一个有关延迟和失败容错的开源库包,用来设计隔离访问远程系统端点或微服务等,防止级联爆炸式的失败,也就是由一个小问题引起接二连三扩大的

疯狂的错误爆炸直至整个系统瘫痪,能够让复杂的分布式系统更加灵活具有弹性。这篇文章给大家介绍下在项目中如何直接使用hystrix?

一、背景

最近由于一些背景原因,需要在项目中需要对接口进行限流。所以就考虑到了直接使用Hystrix。但是呢,又不想直接使用SpringCloud,而是直接引入原生,现在发现挺好用的,所以记录下来,分享出来。

二、使用方式

2.1 Jar包引入

com.netflix.hystrix

hystrix-javanica

1.5.18

com.netflix.hystrix

hystrix-core</artifactId>

1.5.18

引入两个包,分别是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的配置

/**

*

熔断器配置

*

* @author fattycal@qq.com

* @since 2022/6/4

*/

@Configuration

public class HystrixConfig implehttp://ments 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 实现代码

/**

*

熔断器测试

*

* @author fattycal@qq.com

* @since 2022/6/4

*/

@RestController

public class HystrixTestController {

@GetMapping("/hystrix")

@HystrixCommand(commandKey = "hystrixTestConPNQHApdHDRtroller-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=1hystrix.threadpool.hystrixTestController-getHello.maximumSize=2hystrix.threadpool.hystrixTestController-getHello.maxQueueSize=1hystrix.threadpool.hystrixTestController-getHello.queueSizeRejectionThreshold=2#-------------------------------------------------------------------

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

三、测试试验

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

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

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

四、总结

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:java数据结构算法稀疏数组示例详解(什么是稀疏数组)
下一篇:SpringCloud 客户端Ribbon负载均衡的实现方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~