如何动态创建断路器实例?

时间:2020-07-23 12:51:40

标签: spring-boot hystrix circuit-breaker resilience4j

enter image description here

我们与第三方服务器通信,该服务器最终将我们的请求转发到相应的服务器(以serverName作为参数)。可用的服务器存储在我们的服务中。

我们希望将断路器模式应用于这些服务器中的每一个。当前,我们在最右边有两个服务器(两个断路器,应用于我们服务器中的两种不同方法)。但是稍后在第三方服务器上可以添加更多服务器,并将此更改通知我们。

我们希望为此新服务器创建一个新的断路器。

我们不想中断API-0的电路。我们希望在引入新服务器时即时创建断路器。

假设api的格式如下:GET API-0 / {serverName}

然后我们要

API-0 / SERVER-1的CircuitBreaker1

API-0 / SERVER-2的CircuitBreaker2

...等等

我们不想对正在运行的服务进行代码更改。 如果引入了新服务器,我们会收到通知。 使用该通知,我们想要创建一个新的断路器

用于API-0 / SERVER-3的CircuitBreaker3

这是我们目前拥有的。问题是,这只会创建一个断路器实例,因此,如果其中任何一台服务器(1、2或3)关闭,它将打开。

@CircuitBreaker(name="api0")
public Response getData(String serverName, payload){
    return callThirdParty(serverName, payload);
}

我们要为每个服务器维护单独的断路器(使用serverName)。这些服务器可以在运行时创建,因此我们不能为每个服务器都提供seapate函数。

1 个答案:

答案 0 :(得分:0)

在 Spring Boot 中,断路器的名称可以是一个 SpEL 表达式:

@CircuitBreaker(name="#root.args[0]")
public Response getData(String serverName, payload){
    return callThirdParty(serverName, payload);
}

这将使用方法的第一个参数作为断路器的名称。 CircuitBreaker 实例是即时创建的,并使用您的应用程序配置文件中定义的默认 CircuitBreakerConfig。