如何创建动态hystrix命令threadPoolKey

时间:2017-09-14 14:24:37

标签: spring-boot hystrix

我正在使用hystrix在springboot服务中实现断路器概念。在阈值数量失败的情况下,我在需要限制外部服务调用的方法上使用的HystrixCommand注释如下:

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

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

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

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

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

1 个答案:

答案 0 :(得分: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