0

在此处输入图像描述

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

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

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

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

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

那么我们想要,

用于 API-0/SERVER-1 的断路器 1

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)。服务器可以在运行时创建,因此我们不能为每个服务器都提供单独的功能。

4

1 回答 1

1

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

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

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

于 2021-01-12T07:30:15.420 回答