【问题标题】:How to create dynamic hystrixcommand threadPoolKey如何创建动态hystrix命令threadPoolKey
【发布时间】:2018-02-23 14:09:15
【问题描述】:

我正在使用 hystrix 在我的 springboot 服务中实现断路器概念。我在需要限制外部服务调用的方法上使用的 HystrixCommand 注释如下:

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

现在,myHystrixMethod 所在的服务被不同的客户端调用。根据调用服务的客户端类型,有一种逻辑可以调用为该特定客户端指定的后端服务。

我想做的是在它自己的 hystrix 线程池中注册由特定客户端调用的所有线程(请求)。这意味着,来自客户端 A 的请求将在客户端 A 的 hystrix 线程池中注册,而客户端 B 的请求将在客户端 B 的 hystrix 线程池中注册。这将确保客户端 B 对我的服务的请求不会由于客户端 A 的故障而受到限制。

为此,我可以为每个客户端创建单独的服务方法(如上所示)并相应地命名 hystrix 线程池。但是,使用这种方法,每当有新客户端时,我都必须修改源代码以添加它的服务方法。

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

【问题讨论】:

  • 我认为不可能。看一看。 github.com/Netflix/Hystrix/issues/350
  • 看起来用 hystrix 是不可能的。是否有任何其他断路器解决方案,如 hystriix,具有动态创建此类属性的不错选择?
  • 还有其他库,例如 jrugged 和 Resilience4j。但我不认为你会在那里找到这个功能。看看,让我们知道。 :)

标签: spring-boot hystrix


【解决方案1】:

我不知道用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多