关闭Hystrix功能

9

我正在将Hystrix集成到一个应用程序中。该应用程序已经在生产环境中使用,我们将在沙盒中测试hystrix集成工作,然后再推向生产环境。 我的问题是是否有一种方式可以通过某些配置设置来开启/关闭Hystrix功能?


也许将 circuitBreaker.forceClosed 设置为 true 或 circuitBreaker.enabled 设置为 false 可能会有所帮助。 - yousafsajjad
7个回答

12

没有单一的设置来禁用Hystrix。您需要设置多个参数。

请参阅https://github.com/Netflix/Hystrix/wiki/Configuration了解配置选项:

hystrix.command.default.execution.isolation.strategy=SEMAPHORE
hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests=100000 # basically 'unlimited'
hystrix.command.default.execution.timeout.enabled=false 
hystrix.command.default.circuitBreaker.enabled=false
hystrix.command.default.fallback.enabled=false
请仔细检查您使用的Hystrix版本以获取可用参数。

我很快就会对此进行测试。 - yousafsajjad
顺便问一下,将集合策略更改为SEMAPHORE有什么影响吗? - yousafsajjad
1
使用信号量可以避免为您的封装Hystrix命令创建新线程。由于在此禁用设置中不限制并发请求,否则您将最终拥有大量线程。 - ahus1

11

这就是你需要的全部:

# Disable Circuit Breaker (Hystrix)

spring:
  cloud:
    circuit:
      breaker:
        enabled: false

hystrix:
  command:
    default:
      circuitBreaker:
        enabled: false

1
谢谢,这是最正确和简单的解决方案,它在我这里完美地运行。 - NHS

3
如ahus1所说,没有一种完全禁用Hystrix的方法。为了在我们的应用程序中禁用它,我们决定将HystrixCommand放入一个包装类中,并且该包装类仅暴露我们使用的HystrixCommand部分(在我们的情况下,是execute()方法)。构建包装类时,我们将它传递给一个包含我们想要执行的代码的Callable,如果根据我们自己的配置值禁用了Hystrix,我们就直接调用这个Callable,而不创建任何HystrixCommand。这避免了执行任何Hystrix代码,并使得在禁用Hystrix时更容易说“Hystrix在我们的应用程序中完全不起作用”。

这是一个相当不错的解决方案。我正在寻找同样问题的想法,并将使用它。这是我们第一次引入Hystrix,能够轻松地开启/关闭它将非常有用。 - Diana Amza

1

有几种方法可以实现此功能 -

  1. 为您的每个组(包括默认组)执行此操作。尽管这不会禁用hystrix(它只会一直保持电路关闭),但您将实现相同的结果 -

    hystrix.command.{group-key}.circuitBreaker.forceClosed=false

  2. 如果您使用Java,则可以在@HystrixCommand注释上创建环绕建议,并根据标志绕过hystrix执行。

#2的Java代码 -

@Pointcut("@annotation(com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand)")
public void hystrixCommandAnnotationPointcut() {
}

@Around("hystrixCommandAnnotationPointcut()")
public Object methodsAnnotatedWithHystrixCommand(final ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null;
Method method = AopUtils.getMethodFromTarget(joinPoint);
if ((System.getProperty(enable.hystrix).equals("true")) {
    result = joinPoint.proceed();
} else {
    result = method.invoke(joinPoint.getTarget(), joinPoint.getArgs());
}
    return result;
}

第二种方法唯一的问题是,由于切入点对于您的Aspect和HystrixCommandAspect都是相同的,因此它将触发实际的HystrixCommandAspect。 - Sherin Syriac
@SherinSyriac 是的。我的建议仅适用于使用实际HystrixCommand注释进行注释的方法。这样我就可以控制是否启用hystrix。我正在编辑我的答案,以包括我的切入点,使其更加清晰明了。 - Mukul Bansal
你是否声明了<bean class="com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect"/>?如果是的话,那么我认为HystrixCommandAspect将会被触发多次。这是因为两个方面具有相同的切入点。另外,如果它们使用相同的切入点,你如何确保你的方面和HystrixCommandAspect被触发的顺序呢? - Sherin Syriac
是的,我按照你提到的创建了一个bean,但我没有指定任何建议顺序。我猜我的自定义建议总是第一个执行是偶然的。 我也尝试了在阅读了你的评论后使用@Order,以查看是否可以使我的自定义建议在HystricCommand注释上定义的原始建议之后运行,但无法使其工作。我的建议总是先执行。 有什么想法为什么会发生这种情况吗? - Mukul Bansal

0
如果您的项目是Spring管理的,您可以在applicationContext.xml中注释hystrixAspect的bean定义。 请注释以下行:

bean id="hystrixAspect"class="com.netflix.hystrix.contrib.javanica.aop.aspectj.HystrixCommandAspect"/>

这将从您的项目中移除Hystrix。

0

只需要设置 hystrix.command.default.execution.isolation.strategy=SEMAPHORE 即可。此外,你可以或者应该禁用超时线程, 使用 hystrix.command.default.execution.timeout.enabled=false


0

我遇到了这样一种情况,我想使用单个属性完全关闭Hystrix(我们使用IBM uDeploy管理动态属性)。我们使用建立在Hystrix之上的javanica库。

  1. 创建一个配置类,该配置类创建HystrixCommandAspect。

@配置 公共类 HystrixConfiguration{

@Bean(name = "hystrixCommandAspect")
@Conditional(HystrixEnableCondition.class)
public HystrixCommandAspect hystrixCommandAspect(){ 
      return new HystrixCommandAspect()}
}

2. 而且条件类将基于系统属性启用。

public class HystrixEnableCondition implements Condition{ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata){ return "YES".equalsIgnoreCase( context.getEnvironment().getProperty("circuitBreaker.enabled")) || "YES".equalsIgnoreCase( System.getProperty("circuitBreaker.enabled")); } }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接