2017-09-14 104 views
1

我在我的springboot服务中使用hystrix实现断路器概念。我在一个需要油门故障的门限数量的情况下,外部服务呼叫的方式使用HystrixCommand注解如下:如何创建动态hystrix命令threadPoolKey

@HystrixCommand(commandKey = "myCommandKey", 
      groupKey = "myGroupKey", 
      threadPoolKey = "myThreadPoolKey") 
    public String myHystrixMethod(String someParam) { ....} 

现在,这里myHystrixMethod驻留在不同的客户端调用的服务。根据调用该服务的客户端的类型,有一个逻辑来调用为该特定客户端指定的后端服务。

我想要做的是注册由它自己的hystrix线程池中的特定客户端调用的所有线程(请求)。这意味着,客户端A的请求将仅在客户端B的hystrix线程池中为客户端A注册,而客户端B在客户端B的客户端B中注册。这将确保客户B的请求,我的服务在客户端A

不节流,由于故障对于这一点,我可以为每个客户单独的服务方法(如上图所示的一个),并相应地命名红椎线程池。但是,采用这种方法,无论何时有新客户,我都必须修改源代码以添加它的服务方法。

有没有一种方法可以根据参数(在这种情况下是客户端ID)在@HystrixCommand注释中动态创建选项?

+0

我不认为这是可能的。看一看。 https://github.com/Netflix/Hystrix/issues/350 – pvpkiran

+0

看起来像hystrix这是不可能的。是否还有其他类似hystriix的断路器解决方案可以动态地创建这些属性? – Hary

+0

还有其他的图书馆像jrugged和resilience4j。但我不认为你会在那里找到这个功能。看看,让我们知道。 :) – pvpkiran

回答

0

我不知道用Hystrix库做的任何方式,但是因为您已经要求可以做到的任何其他断路器实现,这里是基于Resilience4J库的解决方案。

在您的应用程序上下文中,您可以为客户注册CircuitBreakerRegistry bean,并使用默认配置。

@Bean 
public CircuitBreakerRegistry circuitBreakerRegistry() { 
    CircuitBreakerConfig config = CircuitBreakerConfig.custom() 
      .failureRateThreshold(35) 
      .ringBufferSizeInClosedState(1000) 
      .ringBufferSizeInHalfOpenState(100) 
      .waitDurationInOpenState(Duration.ofMinutes(1)) 
      .build(); 
    return CircuitBreakerRegistry.of(config); 
} 

然后你只需注入这个注册表来为您服务,您的内部保护方法,你可以得到CB为你需要的任何客户端。

CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("ClientA"); 

此操作会发现已经注册的断路器或在必要时使用注册表默认配置创建新的。

现在你可以使用任何CircuitBreaker方法的选择:isCallPermitted()executeRunnable()或任何其他。

欲了解更多信息,请看看User Guide