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

作者:编号94530 时间:2021-10-22 01:55:21 

什么是Hystrix

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

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

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

疯狂的错误 * 直至整个系统瘫痪,能够让复杂的分布式系统更加灵活具有弹性。这篇文章给大家介绍下在项目中如何直接使用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,拿到跑测试, 具体下载过程就不一样展示了,直接贴出测试结果。

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

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

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

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

四、总结

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

来源:https://www.cnblogs.com/lifacheng/p/16341993.html

标签:hystrix,使用
0
投稿

猜你喜欢

  • 浅谈java安全编码指南之死锁dead lock

    2023-06-22 04:49:19
  • SpringBoot+JWT实现注册、登录、状态续签流程分析

    2022-09-29 09:07:11
  • OpenCV实现人脸识别简单程序

    2023-07-07 00:31:12
  • Java制作智能拼图游戏原理及代码

    2022-08-02 21:46:57
  • Java接口中尽量避免使用数组

    2022-07-06 23:24:14
  • Java springboot yaml语法注解

    2023-06-17 08:13:35
  • C#四种计时器Timer的区别和用法

    2021-10-12 01:31:14
  • 一文看懂RabbitMQ消息丢失如何防止

    2022-03-03 20:36:24
  • 详解java IO流之缓冲流的使用

    2023-08-08 18:33:16
  • Java实现新建有返回值的线程的示例详解

    2022-02-13 17:09:33
  • Java守护线程实例详解_动力节点Java学院整理

    2023-03-29 08:14:30
  • 使用注解解决ShardingJdbc不支持复杂SQL方法

    2022-08-03 02:15:12
  • 使用springboot整合RateLimiter限流过程

    2022-09-12 21:42:48
  • Java C++ 算法题解leetcode145商品折扣后最终价格单调栈

    2023-09-16 23:29:42
  • springboot cloud使用eureka整合分布式事务组件Seata 的方法

    2023-08-19 13:49:44
  • spring boot devtools在Idea中实现热部署方法

    2023-07-20 02:31:25
  • ActiveMQ安装及部署教程图解

    2023-11-17 18:01:46
  • C#枚举类型与位域枚举Enum

    2023-03-02 06:52:27
  • Java中继承thread类与实现Runnable接口的比较

    2022-06-09 12:57:09
  • Java实现扑克牌程序

    2023-11-11 12:09:52
  • asp之家 软件编程 m.aspxhome.com