如何即时创建断路器实例?

How to create circuit breaker instances on the fly?

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

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

我们想为这个新服务器创建一个新的断路器。

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

假设 api 是这种形式:GET API-0/{serverName}

那么我们要,

用于 API-0/SERVER-1

的断路器 1

API-0/SERVER-2

的断路器 2

...等等

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

CircuitBreaker3 用于 API-0/SERVER-3

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

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

我们想为每个服务器维护单独的断路器(使用服务器名称)。服务器可以在运行时创建,因此我们不能为每个服务器提供单独的功能。

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

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

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