2017-09-14 79 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